예제 #1
0
        public static TAcc Transduce <TAcc, TIn, TOut>(this IEnumerable <TIn> source, ITransducer <TIn, TOut> transducer, Func <TAcc, TOut, TAcc> reducer, TAcc seed)
        {
            var sourceEnum = source.GetEnumerator();
            var status     = new ReductionStatus();
            var res        = seed;
            var red        = transducer.Transform(status, reducer);

            while (!status.Complete && sourceEnum.MoveNext())
            {
                res = red(res, sourceEnum.Current);
            }
            return(res);
        }
예제 #2
0
        public Func <TAcc, TSource, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TSource, TAcc> reducer)
        {
            var prefixComplete = _prefixCompleteFactory();

            return((acc, source) => {
                if (prefixComplete(source))
                {
                    status.Complete = true;
                    return acc;
                }
                return reducer(acc, source);
            });
        }
예제 #3
0
        public static IEnumerable <TOut> Transduce <TIn, TOut>(this IEnumerable <TIn> source, ITransducer <TIn, TOut> transducer)
        {
            var sourceEnum = source.GetEnumerator();
            var status     = new ReductionStatus();
            var red        = transducer.Transform <Optional <TOut> >(status, Utils.Enumerator);

            while (sourceEnum.MoveNext())
            {
                var res = red(new Optional <TOut>(), sourceEnum.Current);
                if (status.Complete)
                {
                    break;
                }
                if (res.HasValue)
                {
                    yield return(res.Value);
                }
            }
        }
예제 #4
0
        public Func <TAcc, TSource, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TSource, TAcc> reducer)
        {
            var  prefixComplete = _prefixCompleteFactory();
            bool skipping       = true;

            return((acc, source) => {
                if (!skipping)
                {
                    return reducer(acc, source);
                }
                else if (prefixComplete(source))
                {
                    skipping = false;
                    return reducer(acc, source);
                }
                else
                {
                    return acc;
                }
            });
        }
예제 #5
0
 public Func <TAcc, TIn, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TOut, TAcc> reducer)
 {
     return(_transducer1.Transform(status, _transducer2.Transform(status, reducer)));
 }
예제 #6
0
 public Func <TAcc, TIn, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TOut, TAcc> reducer)
 {
     return((acc, source) => reducer(acc, _selector(source)));
 }
예제 #7
0
 public Func <TAcc, TSource, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TSource, TAcc> reducer)
 {
     return((acc, source) => _predicate(source) ? reducer(acc, source) : acc);
 }