using System;
using System.Collections.Generic;
using System.Linq;
namespace Swan {
///
/// Functional programming extension methods.
///
public static class FunctionalExtensions {
///
/// Whens the specified condition.
///
/// The type of IQueryable.
/// The list.
/// The condition.
/// The function.
///
/// The IQueryable.
///
///
/// this
/// or
/// condition
/// or
/// fn.
///
public static IQueryable When(this IQueryable list, Func condition, Func, IQueryable> fn) {
if(list == null) {
throw new ArgumentNullException(nameof(list));
}
if(condition == null) {
throw new ArgumentNullException(nameof(condition));
}
if(fn == null) {
throw new ArgumentNullException(nameof(fn));
}
return condition() ? fn(list) : list;
}
///
/// Whens the specified condition.
///
/// The type of IEnumerable.
/// The list.
/// The condition.
/// The function.
///
/// The IEnumerable.
///
///
/// this
/// or
/// condition
/// or
/// fn.
///
public static IEnumerable When(this IEnumerable list, Func condition, Func, IEnumerable> fn) {
if(list == null) {
throw new ArgumentNullException(nameof(list));
}
if(condition == null) {
throw new ArgumentNullException(nameof(condition));
}
if(fn == null) {
throw new ArgumentNullException(nameof(fn));
}
return condition() ? fn(list) : list;
}
///
/// Adds the value when the condition is true.
///
/// The type of IList element.
/// The list.
/// The condition.
/// The value.
///
/// The IList.
///
///
/// this
/// or
/// condition
/// or
/// value.
///
public static IList AddWhen(this IList list, Func condition, Func value) {
if(list == null) {
throw new ArgumentNullException(nameof(list));
}
if(condition == null) {
throw new ArgumentNullException(nameof(condition));
}
if(value == null) {
throw new ArgumentNullException(nameof(value));
}
if(condition()) {
list.Add(value());
}
return list;
}
///
/// Adds the value when the condition is true.
///
/// The type of IList element.
/// The list.
/// if set to true [condition].
/// The value.
///
/// The IList.
///
/// list.
public static IList AddWhen(this IList list, Boolean condition, T value) {
if(list == null) {
throw new ArgumentNullException(nameof(list));
}
if(condition) {
list.Add(value);
}
return list;
}
///
/// Adds the range when the condition is true.
///
/// The type of List element.
/// The list.
/// The condition.
/// The value.
///
/// The List.
///
///
/// this
/// or
/// condition
/// or
/// value.
///
public static List AddRangeWhen(this List list, Func condition, Func> value) {
if(list == null) {
throw new ArgumentNullException(nameof(list));
}
if(condition == null) {
throw new ArgumentNullException(nameof(condition));
}
if(value == null) {
throw new ArgumentNullException(nameof(value));
}
if(condition()) {
list.AddRange(value());
}
return list;
}
}
}