Example #1
0
        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);
            }
        }
Example #2
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
        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);
        }