internal static async UniTask <ILookup <TKey, TSource> > ToLookupAsync <TSource, TKey>(IUniTaskAsyncEnumerable <TSource> source, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer, CancellationToken cancellationToken) { var pool = ArrayPool <TSource> .Shared; var array = pool.Rent(16); var e = source.GetAsyncEnumerator(cancellationToken); try { var i = 0; while (await e.MoveNextAsync()) { ArrayPoolUtil.EnsureCapacity(ref array, i, pool); array[i++] = e.Current; } if (i == 0) { return(Lookup <TKey, TSource> .CreateEmpty()); } else { return(Lookup <TKey, TSource> .Create(new ArraySegment <TSource>(array, 0, i), keySelector, comparer)); } } finally { pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType <TSource>()); if (e != null) { await e.DisposeAsync(); } } }
internal static async UniTask <TSource[]> ToArrayAsync <TSource>(IUniTaskAsyncEnumerable <TSource> source, CancellationToken cancellationToken) { // UnityEngine.Debug.Log("Called ToArray"); var pool = ArrayPool <TSource> .Shared; var array = pool.Rent(16); TSource[] result = default; IUniTaskAsyncEnumerator <TSource> e = default; try { e = source.GetAsyncEnumerator(cancellationToken); var i = 0; while (await e.MoveNextAsync()) { ArrayPoolUtil.EnsureCapacity(ref array, i, pool); array[i++] = e.Current; } if (i == 0) { result = Array.Empty <TSource>(); } else { result = new TSource[i]; Array.Copy(array, result, i); } } finally { pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType <TSource>()); if (e != null) { await e.DisposeAsync(); } } return(result); }