コード例 #1
0
    public static Fabric.IAsyncEnumerable <TResult> SelectAsync <TSource, TResult>(this Fabric.IAsyncEnumerable <TSource> source, Func <TSource, Task <TResult> > selector)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }
        if (selector == null)
        {
            throw new ArgumentNullException(nameof(selector));
        }

        return(Create(() =>
        {
            var e = source.GetEnumerator();
            var current = default(TResult);

            var cts = new CancellationTokenDisposable();
            var d = Disposable.Create(cts, e);

            return Create(async ct =>
            {
                if (await e.MoveNext(cts.Token).ConfigureAwait(false))
                {
                    current = await selector(e.Current).ConfigureAwait(false);
                    return true;
                }
                return false;
            },
                          () => current,
                          d.Dispose,
                          e
                          );
        }));
    }
コード例 #2
0
    public static Fabric.IAsyncEnumerable <TSource> WhereAsync <TSource>(this Fabric.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
                          );
        }));
    }
コード例 #3
0
    public static async Task ForEachAsyncAsync <TSource>(this Fabric.IAsyncEnumerable <TSource> source, Func <TSource, Task> action, CancellationToken cancellationToken)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }
        if (action == null)
        {
            throw new ArgumentNullException(nameof(action));
        }

        using (var e = source.GetEnumerator())
        {
            while (await e.MoveNext(cancellationToken).ConfigureAwait(false))
            {
                await action(e.Current).ConfigureAwait(false);
            }
        }
    }
コード例 #4
0
 public AsyncEnumerableFabricWrapper(Fabric.IAsyncEnumerable <T> inner)
 {
     _inner = inner;
 }
コード例 #5
0
 public static IAsyncEnumerable <T> AsAsyncEnumerable <T>(this Fabric.IAsyncEnumerable <T> enumerable)
 {
     return(new AsyncEnumerableFabricWrapper <T>(enumerable));
 }
コード例 #6
0
    public static Fabric.IAsyncEnumerable <TResult> SelectManyAsync <TSource, TResult>(this Fabric.IAsyncEnumerable <TSource> source, Func <TSource, int, Task <IAsyncEnumerable <TResult> > > selector)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }
        if (selector == null)
        {
            throw new ArgumentNullException(nameof(selector));
        }

        return(Create(() =>
        {
            var e = source.GetEnumerator();
            var ie = default(Fabric.IAsyncEnumerator <TResult>);

            var innerDisposable = new AssignableDisposable();

            var index = 0;

            var cts = new CancellationTokenDisposable();
            var d = Disposable.Create(cts, innerDisposable, e);

            // ReSharper disable once RedundantAssignment
            var inner = default(Func <CancellationToken, Task <bool> >);
            var outer = default(Func <CancellationToken, Task <bool> >);

            inner = async ct =>
            {
                if (await e.MoveNext(ct).ConfigureAwait(false))
                {
                    return true;
                }
                innerDisposable.Disposable = null;
                // ReSharper disable once AccessToModifiedClosure
                // ReSharper disable once PossibleNullReferenceException
                return await outer(ct).ConfigureAwait(false);
            };

            outer = async ct =>
            {
                if (await e.MoveNext(ct).ConfigureAwait(false))
                {
                    var enumerable = await selector(e.Current, checked (index++)).ConfigureAwait(false);
                    ie = enumerable.GetEnumerator();
                    innerDisposable.Disposable = ie;

                    return await inner(ct).ConfigureAwait(false);
                }
                return false;
            };

            return Create(ct => ie == null ? outer(ct) : inner(ct),
                          () => ie.Current,
                          d.Dispose,
                          e
                          );
        }));
    }