public static async Task ForAllAsync <T>(this IEnumerableAsync <T> items, T action)
        {
            var iterator = items.GetIterator();
            await iterator.IterateAsync(action);

            // while (await enumerator.MoveNextAsync(action)) { };
        }
        public static IEnumerableAsync <T> PrespoolAsync <T>(this IEnumerableAsync <T> items)
        {
            var iterator        = items.GetIterator();
            var queue           = new ConcurrentQueue <Func <T, Task> >();
            var totalExpression = GetTotalExpression <T>();
            var basicExpression = totalExpression(queue);
            var iterationTask   = iterator.IterateAsync(basicExpression);

            return(EnumerableAsync.YieldAsync <T>(
                       async(yieldAsync) =>
            {
                while (!iterationTask.IsCompleted ||
                       queue.Count() > 0)
                {
                    Func <T, Task> callback;
                    if (queue.TryDequeue(out callback))
                    {
                        await callback(yieldAsync);
                    }
                }
            }));
        }