Exemplo n.º 1
0
        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();
                }
            }
        }
Exemplo n.º 2
0
        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);
        }