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 ); })); }
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 ); })); }
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); } } }
public AsyncEnumerableFabricWrapper(Fabric.IAsyncEnumerable <T> inner) { _inner = inner; }
public static IAsyncEnumerable <T> AsAsyncEnumerable <T>(this Fabric.IAsyncEnumerable <T> enumerable) { return(new AsyncEnumerableFabricWrapper <T>(enumerable)); }
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 ); })); }