// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT License.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Threading.Tasks;
namespace System.Linq
{
public static partial class AsyncEnumerableEx
{
///
/// Converts a task to an async-enumerable sequence.
///
/// The type of the elements in the source task.
/// Task to convert to an async-enumerable sequence.
/// The async-enumerable sequence whose element is pulled from the given task.
/// is null.
public static IAsyncEnumerable ToAsyncEnumerable(this Task task)
{
if (task == null)
throw Error.ArgumentNull(nameof(task));
return new TaskToAsyncEnumerable(task);
}
private sealed class TaskToAsyncEnumerable : AsyncIterator
{
private readonly Task _task;
public TaskToAsyncEnumerable(Task task) => _task = task;
public override AsyncIteratorBase Clone() => new TaskToAsyncEnumerable(_task);
protected override async ValueTask MoveNextCore()
{
if (_state == AsyncIteratorState.Allocated)
{
_state = AsyncIteratorState.Iterating;
_current = await _task.ConfigureAwait(false);
return true;
}
return false;
}
}
}
}