private static async Task <IEnumerable <T> > ToEnumerableAsync <T>([NotNull] Task <T> item)
            where T : class
        {
            var result = await item.ConfigureAwait(false);

            return(result == null ? null : MaterializationPolicyExtensions.ToEnumerable(result));
        }
 /// <summary>
 /// Creates an <see cref="IAsyncEnumerable{T}"/> from a generator.
 /// </summary>
 /// <param name="policy">
 /// The policy.
 /// </param>
 /// <param name="generateItem">
 /// The generate Item.
 /// </param>
 /// <param name="dispose">
 /// Function to call when disposing the generator.
 /// </param>
 /// <typeparam name="T">
 /// The type of the items.
 /// </typeparam>
 /// <typeparam name="TState">
 /// The type of the enumerator state.
 /// </typeparam>
 /// <returns>
 /// The <see cref="IAsyncEnumerable{T}"/>.
 /// </returns>
 public static IAsyncEnumerable <T> CreateAsyncEnumerable <T, TState>(this IMaterializationPolicy policy, Func <TState, Task <T> > generateItem, [CanBeNull] Action <TState> dispose = null)
     where TState : new()
     where T : class
 => policy.CreateAsyncEnumerable(() => new GeneratorEnumerable <T, TState>(() => Task.FromResult(new TState()), context => MaterializationPolicyExtensions.ToEnumerableAsync(generateItem(context)), dispose));
 /// <summary>
 /// Creates an <see cref="IAsyncEnumerable{T}"/> from a generator.
 /// </summary>
 /// <param name="policy">
 /// The policy.
 /// </param>
 /// <param name="initialize">
 /// Initializes the enumerable, and returns the context.
 /// </param>
 /// <param name="generateItem">
 /// Returns an item or <c>null</c> when no more items are available.
 /// </param>
 /// <param name="dispose">
 /// Function to call when disposing the generator.
 /// </param>
 /// <typeparam name="T">
 /// The type of the items.
 /// </typeparam>
 /// <typeparam name="TState">
 /// The type of the enumerator state.
 /// </typeparam>
 /// <returns>
 /// The <see cref="IAsyncEnumerable{T}"/>.
 /// </returns>
 public static IAsyncEnumerable <T> CreateAsyncEnumerable <T, TState>(this IMaterializationPolicy policy, Func <Task <TState> > initialize, Func <TState, Task <T> > generateItem, [CanBeNull] Action <TState> dispose = null)
     where T : class
 => policy.CreateAsyncEnumerable(initialize, context => MaterializationPolicyExtensions.ToEnumerableAsync(generateItem(context)), dispose);