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