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 <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); }