using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; namespace xDataService.Mongo { public class XAsyncEnumerableAdapter : IAsyncEnumerable { // private readonly IAsyncCursorSource asyncCursorSource; // public XAsyncEnumerableAdapter (IAsyncCursorSource asyncCursorSource) { this.asyncCursorSource = asyncCursorSource; } // public IAsyncEnumerator GetAsyncEnumerator (CancellationToken cancellationToken) => new XAsyncEnumeratorAdapter (asyncCursorSource, cancellationToken); } public class XAsyncEnumeratorAdapter : IAsyncEnumerator { private readonly IAsyncCursorSource asyncCursorSource; private readonly CancellationToken cancellationToken; private IAsyncCursor asyncCursor; private IEnumerator batchEnumerator; public T Current => batchEnumerator.Current; public XAsyncEnumeratorAdapter ( IAsyncCursorSource asyncCursorSource, CancellationToken cancellationToken ) { // this.asyncCursorSource = asyncCursorSource; this.cancellationToken = cancellationToken; } public async ValueTask MoveNextAsync () { // if (asyncCursor == null) { asyncCursor = await asyncCursorSource .ToCursorAsync (cancellationToken); } // if (batchEnumerator != null && batchEnumerator.MoveNext ()) { return true; } // if (asyncCursor != null && await asyncCursor.MoveNextAsync (cancellationToken)) { // batchEnumerator?.Dispose (); batchEnumerator = asyncCursor.Current.GetEnumerator (); // return batchEnumerator.MoveNext (); } // return false; } public async ValueTask DisposeAsync () { // await Task.CompletedTask; asyncCursor?.Dispose (); asyncCursor = null; } } }