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); }
public static IObservable <TAcc> Transduce <TAcc, TIn, TOut>(this IObservable <TIn> source, ITransducer <TIn, TOut> transducer, Func <TAcc, TOut, TAcc> reducer, TAcc seed) { var status = new ReductionStatus(); var res = seed; var red = transducer.Transform(status, reducer); return(new AnonymousObservable <TAcc>(observer => source.Subscribe(el => { if (status.Complete) { observer.OnNext(res); observer.OnCompleted(); return; } res = red(res, el); }, observer.OnError, () => { observer.OnNext(res); observer.OnCompleted(); }))); }
public static IObservable <TOut> Transduce <TIn, TOut>(this IObservable <TIn> source, ITransducer <TIn, TOut> transducer) { var status = new ReductionStatus(); var reducer = transducer.Transform <Optional <TOut> >(status, Utils.Enumerator); return(new AnonymousObservable <TOut>(observer => source.Subscribe(el => { if (status.Complete) { observer.OnCompleted(); return; } var res = reducer(new Optional <TOut>(), el); if (res.HasValue) { observer.OnNext(res.Value); } }, observer.OnError, observer.OnCompleted))); }
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); } } }
public Func <TAcc, TIn, TAcc> Transform <TAcc>(ReductionStatus status, Func <TAcc, TOut, TAcc> reducer) { return(_transducer1.Transform(status, _transducer2.Transform(status, reducer))); }