internal static Fallible <TSource> ReduceImpl <TSource>( this IEnumerable <TSource> source, Func <TSource, TSource, Fallible <TSource> > accumulator, Func <Fallible <TSource>, bool> predicate) { Debug.Assert(source != null); Debug.Assert(accumulator != null); Debug.Assert(predicate != null); using (var iter = source.GetEnumerator()) { if (!iter.MoveNext()) { throw new InvalidOperationException("Source sequence was empty."); } Fallible <TSource> retval = Fallible <TSource> .η(iter.Current); while (predicate(retval) && iter.MoveNext()) { retval = retval.Bind(val => accumulator(val, iter.Current)); } return(retval); } }
internal static Fallible <IEnumerable <TSource> > CollectImpl <TSource>( this IEnumerable <Fallible <TSource> > source) { Debug.Assert(source != null); var seed = Fallible <IEnumerable <TSource> > .η(Enumerable.Empty <TSource>()); Func <IEnumerable <TSource>, TSource, IEnumerable <TSource> > append = (seq, item) => seq.Append(item); var accumulator = Fallible.Lift <IEnumerable <TSource>, TSource, IEnumerable <TSource> >(append); return(source.Aggregate(seed, accumulator)); }
internal static Fallible <IEnumerable <TSource> > WhereImpl <TSource>( this IEnumerable <TSource> source, Func <TSource, Fallible <bool> > predicate) { Debug.Assert(source != null); Debug.Assert(predicate != null); var seed = Fallible <IEnumerable <TSource> > .η(Enumerable.Empty <TSource>()); Func <TSource, Func <bool, IEnumerable <TSource>, IEnumerable <TSource> > > func = item => (b, seq) => b?seq.Append(item) : seq; Func <Fallible <IEnumerable <TSource> >, TSource, Fallible <IEnumerable <TSource> > > accumulator = (mseq, item) => predicate(item).ZipWith(mseq, func(item)); return(source.Aggregate(seed, accumulator)); }
internal static Fallible <TAccumulate> FoldImpl <TSource, TAccumulate>( this IEnumerable <TSource> source, TAccumulate seed, Func <TAccumulate, TSource, Fallible <TAccumulate> > accumulator) { Debug.Assert(source != null); Debug.Assert(accumulator != null); Fallible <TAccumulate> retval = Fallible <TAccumulate> .η(seed); using (var iter = source.GetEnumerator()) { while (iter.MoveNext()) { retval = retval.Bind(val => accumulator(val, iter.Current)); } } return(retval); }