| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | // Licensed to the .NET Foundation under one or more agreements.// The .NET Foundation licenses this file to you under the Apache 2.0 License.// See the LICENSE file in the project root for more information. using System.Security;namespace System.Linq{    internal sealed class Yielder<T> : IYielder<T>, IAwaitable, IAwaiter    {        private readonly Action<Yielder<T>> _create;        private Action? _continuation;        private bool _hasValue;        private bool _running;        private bool _stopped;        public Yielder(Action<Yielder<T>> create)        {            _create = create;            Current = default!;        }        public T Current { get; private set; }        public IAwaiter GetAwaiter() => this;        public bool IsCompleted => false;        public void GetResult()        {        }        [SecurityCritical]        public void UnsafeOnCompleted(Action continuation)        {            _continuation = continuation;        }        public void OnCompleted(Action continuation)        {            _continuation = continuation;        }        public IAwaitable Return(T value)        {            _hasValue = true;            Current = value;            return this;        }        public IAwaitable Break()        {            _stopped = true;            return this;        }        public Yielder<T> GetEnumerator() => this;        public bool MoveNext()        {            if (!_running)            {                _running = true;                _create(this);            }            else            {                _hasValue = false;                _continuation!();            }            return !_stopped && _hasValue;        }        public void Reset() => throw new NotSupportedException();    }}
 |