public static IDataflow <Either <TLeft, TRightOutput> > BindSafe <TLeft, TRightInput, TRightOutput>(
     this IDataflow <Either <TLeft, TRightInput> > source,
     Func <TRightInput, IDataflow <Either <TLeft, TRightOutput> > > bindFunc)
 {
     return(source.Bind(item =>
                        item.Match(
                            right => bindFunc(right),
                            left => source.Factory.Return(Left <TLeft, TRightOutput>(left)))));
 }
 public static IDataflow <IList <T> > ToList <T>(this IDataflow <T> source)
 {
     return(source.Bind(item => source.Factory.ToList(item)));
 }
 public static IDataflow <TOutput> Select <TInput, TOutput>(this IDataflow <TInput> source,
                                                            Func <TInput, TOutput> selector)
 {
     return(source.Bind(item => source.Factory.Return(selector(item))));
 }
 public static IDataflow <IGroupedDataflow <TKey, TElement> > GroupBy <TElement, TKey>(this IDataflow <TElement> source,
                                                                                       Func <TElement, TKey> keySelector)
 {
     return(source.Bind(item => source.Factory.GroupBy(item, keySelector)));
 }
 public static IDataflow <IList <T> > Buffer <T>(this IDataflow <T> source,
                                                 TimeSpan batchTimeout, int batchMaxSize)
 {
     return(source.Bind(item => source.Factory.Buffer(item, batchTimeout, batchMaxSize)));
 }
 public static IDataflow <TOutput> SelectManyAsync <TInput, TOutput>(this IDataflow <TInput> source,
                                                                     Func <TInput, Task <IEnumerable <TOutput> > > selector)
 {
     return(source.Bind(item => source.Factory.ReturnManyAsync(selector(item))));
 }
 public static IDataflow <TOutput> SelectMany <TInput, TOutput>(this IDataflow <TInput> source,
                                                                Func <TInput, IDataflow <TOutput> > selector)
 {
     return(source.Bind(selector));
 }
 public static IDataflow <TOutput> SelectMany <TInput, TOutput>(this IDataflow <TInput> source,
                                                                Func <TInput, IEnumerable <TOutput> > selector)
 {
     return(source.Bind(input => source.Factory.ReturnMany(selector(input))));
 }