public static MList <T> Concat(MList <MList <T> > monad) { List <T> list = new List <T>(); foreach (MList <T> ml in monad) { foreach (T t in ml) { list.Add(t); } } return(new MList <T>(list)); }
public ListMatch <T, V> Filled(Func <T, MList <T>, V> f) { MList <T> m = Value; if (m != null && m.Length > 0) { return(new ListMatch <T, V>(m, f(m.Head, m.Tail))); } else { return(this); } }
public ListMatch <T, V> Empty(Func <V> f) { MList <T> m = Value; if (m == null || m.Length > 0) { return(this); } else { return(new ListMatch <T, V>(f())); } }
public static Func <MList <T>, MList <U> > ApS <U>(MList <Func <T, U> > appl) { return(_t => { List <U> list = new List <U>(); foreach (Func <T, U> f in appl) { foreach (T t in _t) { list.Add(f(t)); } } return new MList <U>(list); }); }
public static new ListMatch <T, V> New(MList <T> mlist, V item) { return(new ListMatch <T, V>(mlist, item)); }
public ListMatch(MList <T> mlist, V item) : base(mlist, item) { }
public MList <U> Ap <U>(MList <Func <T, U> > appl) { return(MList <T> .ApS(appl)(this)); }
public static MList <T> Join(MList <MList <T> > list) { return(Concat(list)); }
public MList <U> Then <U>(MList <U> monad) { return(monad); }
public MList <U> Bind <U>(Func <T, MList <U> > f) { return(MList <U> .Join(FMap(f))); }