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())));
        }
Example #2
0
        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())));
        }
Example #6
0
        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>())));
        }
Example #13
0
 public MonadAdapter <TLeft> GetMonadAdapter()
 {
     return(MonadAdapterRegistry.Get <TLeft>(typeof(Either <,>)));
 }
Example #14
0
 public MonadAdapter <TR> GetMonadAdapter()
 {
     return(MonadAdapterRegistry.Get <TR>(typeof(Reader <,>)));
 }
Example #15
0
 public MonadAdapter <TMonoid, TW> GetMonadAdapter()
 {
     return(MonadAdapterRegistry.Get <TMonoid, TW>(typeof(Writer <, ,>)));
 }
Example #16
0
 public MonadAdapter <TS> GetMonadAdapter()
 {
     return(MonadAdapterRegistry.Get <TS>(typeof(State <,>)));
 }
Example #17
0
 public MonadAdapter GetMonadAdapter()
 {
     return(MonadAdapterRegistry.Get(typeof(Maybe <>)));
 }