public static SuperThing <B> Select <A, B>(this SuperThing <A> ma, Func <A, B> f) => sa => { var a = ma(sa); if (a.State.HasExited) { return(new SuperState <B>(default(B), a.State)); } return(new SuperState <B>(f(a.Value), a.State)); };
public static SuperThing <C> SelectMany <A, B, C>(this SuperThing <A> ma, Func <A, SuperThing <B> > bind, Func <A, B, C> project) => sa => { var a = ma(sa); if (a.State.HasExited) { return(new SuperState <C>(default(C), a.State)); } var b = bind(a.Value)(a.State); if (b.State.HasExited) { return(new SuperState <C>(default(C), b.State)); } return(new SuperState <C>(project(a.Value, b.Value), b.State)); };