static IAsyncEnumerator <T> Create <T>(Func <CancellationToken, TaskCompletionSource <bool>, Task <bool> > moveNext, Func <T> current, Action dispose) { var self = default(IAsyncEnumerator <T>); self = new AnonymousAsyncEnumerator <T>( ct => { var tcs = new TaskCompletionSource <bool>(); var stop = new Action(() => { self.Dispose(); tcs.TrySetCanceled(); }); var ctr = ct.Register(stop); var res = moveNext(ct, tcs).Finally(ctr.Dispose); return(res); }, current, dispose ); return(self); }
private static IAsyncEnumerator <T> CreateEnumerator <T>(Func <CancellationToken, TaskCompletionSource <bool>, Task <bool> > moveNext, Func <T> current, Action dispose) { var self = default(IAsyncEnumerator <T>); self = new AnonymousAsyncEnumerator <T>( async ct => { var tcs = new TaskCompletionSource <bool>(); var stop = new Action( () => { self.Dispose(); tcs.TrySetCanceled(); }); using (ct.Register(stop)) { return(await moveNext(ct, tcs) .ConfigureAwait(false)); } }, current, dispose ); return(self); }