// 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; } } } }