public static TMonad When <TMonad>(bool b, TMonad m) where TMonad : IMonad <Unit> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)(b ? m : monadAdapter.Return(new Unit()))); }
public void Test1() { var eitherMonadAdapter = MonadAdapterRegistry.Get <string>(typeof(Either <,>)); var either = (Either <string, int>)eitherMonadAdapter.Return(42); Assert.That(either.Right, Is.EqualTo(42)); }
public static Func <TA, TMonad> Compose <TMonad, TA, TB, TC>(Func <TA, IMonad <TB> > f, Func <TB, IMonad <TC> > g) where TMonad : IMonad <TC> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return(a => (TMonad)monadAdapter.Bind(f(a), g)); }
// ReSharper disable FunctionRecursiveOnAllPaths public static TMonad Forever <TMonad, TA, TB>(IMonad <TA> m) where TMonad : IMonad <TB> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)monadAdapter.BindIgnoringLeft(m, Forever <TMonad, TA, TB>(m))); }
// ReSharper restore FunctionRecursiveOnAllPaths public static TMonad Void <TMonad, TA>(IMonad <TA> m) where TMonad : IMonad <Unit> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)monadAdapter.BindIgnoringLeft(m, monadAdapter.Return(new Unit()))); }
public void Test3() { var writerMonadAdapter = MonadAdapterRegistry.Get <ListMonoid <TwTuple>, TwTuple>(typeof(Writer <ListMonoid <TwTuple>, TwTuple, int>)); var writer = (Writer <ListMonoid <TwTuple>, TwTuple, int>)writerMonadAdapter.Return(42); Assert.That(writer.RunWriter.Item1, Is.EqualTo(42)); }
public static TMonad Join <TMonadMonad, TMonad, TA>(TMonadMonad mma) where TMonadMonad : IMonad <TMonad> where TMonad : IMonad <TA> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)monadAdapter.Bind(mma, ma => ma)); }
// ReSharper disable InconsistentNaming public static TMonad FoldM_ <TMonad, TA, TB>(Func <TA, TB, IMonad <TA> > f, TA a, IEnumerable <TB> bs) where TMonad : IMonad <Unit> // ReSharper restore InconsistentNaming { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)monadAdapter.BindIgnoringLeft(FoldM <IMonad <TA>, TA, TB>(f, a, bs), monadAdapter.Return(new Unit()))); }
// ReSharper disable InconsistentNaming public static TMonad Sequence_ <TMonad, TA>(IEnumerable <IMonad <TA> > ms) where TMonad : IMonad <Unit> // ReSharper restore InconsistentNaming { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); var z = monadAdapter.Return(new Unit()); return((TMonad)ms.FoldRight(z, monadAdapter.BindIgnoringLeft)); }
public static TMonad Sequence <TMonad, TA>(IEnumerable <IMonad <TA> > ms) where TMonad : IMonad <IEnumerable <TA> > { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); var z = monadAdapter.Return(MonadHelpers.Nil <TA>()); return((TMonad)ms.FoldRight( z, (m, mtick) => monadAdapter.Bind( m, x => monadAdapter.Bind( mtick, xs => monadAdapter.Return(MonadHelpers.Cons(x, xs)))))); }
public static TMonad FoldM <TMonad, TA, TB>(Func <TA, TB, IMonad <TA> > f, TA a, IEnumerable <TB> bs) where TMonad : IMonad <TA> { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)bs.HeadAndTail().Match( tuple => { var x = tuple.Item1; var xs = tuple.Item2; var m = f(a, x); return monadAdapter.Bind(m, acc => FoldM <TMonad, TA, TB>(f, acc, xs)); }, () => monadAdapter.Return(a))); }
public static TMonad FilterM <TMonad, TA>(Func <TA, IMonad <bool> > p, IEnumerable <TA> @as) where TMonad : IMonad <IEnumerable <TA> > { var monadAdapter = MonadAdapterRegistry.Get(typeof(TMonad)); return((TMonad)@as.HeadAndTail().Match( tuple => { var x = tuple.Item1; var xs = tuple.Item2; return monadAdapter.Bind( p(x), flg => monadAdapter.Bind( FilterM <TMonad, TA>(p, xs), ys => monadAdapter.Return(flg ? MonadHelpers.Cons(x, ys) : ys))); }, () => monadAdapter.Return(MonadHelpers.Nil <TA>()))); }
public MonadAdapter <TLeft> GetMonadAdapter() { return(MonadAdapterRegistry.Get <TLeft>(typeof(Either <,>))); }
public MonadAdapter <TR> GetMonadAdapter() { return(MonadAdapterRegistry.Get <TR>(typeof(Reader <,>))); }
public MonadAdapter <TMonoid, TW> GetMonadAdapter() { return(MonadAdapterRegistry.Get <TMonoid, TW>(typeof(Writer <, ,>))); }
public MonadAdapter <TS> GetMonadAdapter() { return(MonadAdapterRegistry.Get <TS>(typeof(State <,>))); }
public MonadAdapter GetMonadAdapter() { return(MonadAdapterRegistry.Get(typeof(Maybe <>))); }