Пример #1
0
 public static Writer <Out, Reader <E, V> > SelectMany <Out, E, T, U, V>(
     this Writer <Out, T> self,
     Func <T, Reader <E, U> > bind,
     Func <T, U, V> project
     )
 {
     if (bind == null)
     {
         throw new ArgumentNullException("bind");
     }
     if (project == null)
     {
         throw new ArgumentNullException("project");
     }
     return(() =>
     {
         var resT = self();
         if (resT.IsBottom)
         {
             return WriterResult.Bottom <Out, Reader <E, V> >(resT.Output);
         }
         return WriterResult.Return <Out, Reader <E, V> >(env =>
         {
             var resU = bind(resT.Value)(env);
             if (resU.IsBottom)
             {
                 return ReaderResult.Bottom <V>();
             }
             return ReaderResult.Return(project(resT.Value, resU.Value));
         }, resT.Output);
     });
 }
Пример #2
0
 public static State <S, Reader <E, V> > SelectMany <S, E, T, U, V>(
     this State <S, T> self,
     Func <T, Reader <E, U> > bind,
     Func <T, U, V> project
     )
 {
     if (bind == null)
     {
         throw new ArgumentNullException("bind");
     }
     if (project == null)
     {
         throw new ArgumentNullException("project");
     }
     return((S s) =>
     {
         var resT = self(s);
         if (resT.IsBottom)
         {
             return StateResult.Bottom <S, Reader <E, V> >(s);
         }
         return StateResult.Return <S, Reader <E, V> >(resT.State, envInner =>
         {
             var resU = bind(resT.Value)(envInner);
             if (resU.IsBottom)
             {
                 return new ReaderResult <V>(default(V), true);
             }
             return ReaderResult.Return(project(resT.Value, resU.Value));
         });
     });
 }
Пример #3
0
 private static ReaderResult <T> Return <T>(T value) =>
 ReaderResult.Return(value);