Ejemplo n.º 1
0
        public static IAsyncEnumerable <TSource> WhereAsync <TSource>(this IAsyncEnumerable <TSource> source, Func <TSource, int, Task <bool> > predicate)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            return(Create(() =>
            {
                var e = source.GetEnumerator();
                var index = 0;
                var current = default(TSource);
                var cts = new CancellationTokenDisposable();
                var d = Disposable.Create(cts, e);

                return Create(async ct =>
                {
                    var b = false;
                    bool moveNext;
                    do
                    {
                        moveNext = await e.MoveNext(cts.Token).ConfigureAwait(false);
                        if (moveNext)
                        {
                            b = await predicate(e.Current, checked (index++)).ConfigureAwait(false);
                        }
                    } while (!b && moveNext);
                    if (b)
                    {
                        current = e.Current;
                        return true;
                    }
                    return false;
                },
                              () => current,
                              d.Dispose,
                              e
                              );
            }));
        }