public static ISequence <TResult> CreateOperator <TSource, TResult>( ISequence <TSource> source, Func <IIterator <TSource>, Result <TResult>, CancellationToken, Task <bool> > moveNext ) { return(Create(context => Iterator.CreateOperator <TSource, TResult>(source.Start(context), moveNext))); }
public static ISequence <T> Scan <T>(this ISequence <T> source, Func <T, T, T> accumulator) { return(Create(context => { T current = default(T); bool accumulate = false; return Iterator.CreateOperator <T, T>(source.Start(context), async(iterator, result, cancel) => { if (!await iterator.MoveNext(cancel).ConfigureAwait(false)) { return false; } if (accumulate) { current = accumulator(current, iterator.Current); } else { current = iterator.Current; accumulate = true; } result.Value = current; return true; }); })); }
public static ISequence <TAccumulate> ScanAsync <TSource, TAccumulate>(this ISequence <TSource> source, TAccumulate seed, Func <TAccumulate, TSource, Task <TAccumulate> > accumulator) { return(Create(context => { var current = seed; return Iterator.CreateOperator <TSource, TAccumulate>(source.Start(context), async(iterator, result, cancel) => { if (!await iterator.MoveNext(cancel).ConfigureAwait(false)) { return false; } current = await accumulator(current, iterator.Current); result.Value = current; return true; }); })); }
public static ISequence <T> Skip <T>(this ISequence <T> source, int count) { return(Create(context => { int skip = count; return Iterator.CreateOperator <T, T>(source.Start(context), async(iterator, result, cancel) => { while (await iterator.MoveNext(cancel).ConfigureAwait(false)) { if (skip <= 0) { result.Value = iterator.Current; return true; } --skip; } return false; }); })); }
public static ISequence <T> Take <T>(this ISequence <T> source, int count) { if (count < 0) { throw new ArgumentException("Count must be greater or equal than 0.", "count"); } return(Create(context => { int remaining = count; return Iterator.CreateOperator <T, T>(source.Start(context), async(iterator, result, cancel) => { if (remaining > 0 && await iterator.MoveNext(cancel).ConfigureAwait(false)) { result.Value = iterator.Current; --remaining; return true; } iterator.Dispose(); return false; }); })); }