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