12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // 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;
- }
- 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();
- }
- }
- }
|