public static Fin <Func <B, C> > apply <A, B, C>(Func <A, Func <B, C> > fabc, Fin <A> fa) { if (fa.IsFail) { return(Fin <Func <B, C> > .Fail(fa.Error)); } return(fabc(fa.Value)); }
public static Fin <B> apply <A, B>(Fin <Func <A, B> > fab, Fin <A> fa) { if (fab.IsFail) { return(Fin <B> .Fail(fab.Error)); } if (fa.IsFail) { return(Fin <B> .Fail(fa.Error)); } return(fab.Value(fa.Value)); }
public static Fin <C> apply <A, B, C>(Func <A, B, C> fabc, Fin <A> fa, Fin <B> fb) { if (fa.IsFail) { return(Fin <C> .Fail(fa.Error)); } if (fb.IsFail) { return(Fin <C> .Fail(fb.Error)); } return(fabc(fa.Value, fb.Value)); }
public static Lst <Fin <B> > Traverse <A, B>(this Fin <Lst <A> > ma, Func <A, B> f) => ma.Match( Fail: er => List(Fin <B> .Fail(er)), Succ: xs => xs.Map(x => FinSucc(f(x))));
public static IEnumerable <Fin <B> > Traverse <A, B>(this Fin <IEnumerable <A> > ma, Func <A, B> f) => ma.Match( Fail: er => new[] { Fin <B> .Fail(er) }, Succ: xs => xs.Map(x => FinSucc(f(x))));
public static Fin <A> FinFail <A>(Error value) => Fin <A> .Fail(value);
public static Arr <Fin <B> > Traverse <A, B>(this Fin <Arr <A> > ma, Func <A, B> f) => ma.Match( Fail: er => Array(Fin <B> .Fail(er)), Succ: xs => xs.Map(x => FinSucc(f(x))));
public static Identity <Fin <B> > Traverse <A, B>(this Fin <Identity <A> > ma, Func <A, B> f) => ma.Match( Succ: x => new Identity <Fin <B> >(f(x.Value)), Fail: e => new Identity <Fin <B> >(Fin <B> .Fail(e)));