public static CondAsync <A, D> SelectMany <A, B, C, D>( this CondAsync <A, B> self, Func <B, CondAsync <A, C> > bind, Func <B, C, D> project) => input => from b in self(input) from c in b.Match( Some: b1 => bind(b1)(input), None: () => Option <C> .None.AsTask()) select(from x in b from y in c select project(x, y));
public static CondAsync <A, B> All <A, B>(this CondAsync <A, B> self, params Func <B, bool>[] predicates) => env => self(env).BindAsync( input => { foreach (var pred in predicates) { if (!pred(input)) { return(None); } } return(Optional(input)); }) .ToOption();
public static CondAsync <A, B> Then <A, B>(this CondAsync <A, A> self, Func <A, Task <B> > f) => self.Select(f);
public static CondAsync <A, B> Then <A, B>(this CondAsync <A, A> self, B value) => self.Select(_ => value);
public static CondAsync <A, B> Then <A, B>(this CondAsync <A, A> self, Func <B> f) => self.Select(_ => f());
public static CondAsync <A, B> Where <A, B>(this CondAsync <A, B> self, Func <B, Task <bool> > pred) => input => from b in self(input) from p in b.Map(pred).IfNone(false.AsTask()) select p ? b : None;
public static CondAsync <A, B> Where <A, B>(this CondAsync <A, B> self, Func <B, bool> pred) => input => from b in self(input) select b.Map(pred).IfNone(false) ? b : None;
public static CondAsync <A, C> Select <A, B, C>(this CondAsync <A, B> self, Func <B, C> map) => input => from b in self(input) select b.Map(map);
public static CondAsync <A, C> Map <A, B, C>(this CondAsync <A, B> self, Func <B, C> map) => Select(self, map);
public static Func <Task <A>, Task <B> > ElseAsync <A, B>(this CondAsync <A, B> self, B value) => input => from a in input from b in self(a).ContinueWith(b => b.Result.IfNone(value)) select b;
public static Func <A, Task <B> > Else <A, B>(this CondAsync <A, B> self, B value) => input => self(input).ContinueWith(b => b.Result.IfNone(value));
public static Func <A, Task <B> > Else <A, B>(this CondAsync <A, B> self, Func <B> f) => input => self(input).ContinueWith(b => b.Result.IfNone(() => f()));