1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- using Cysharp.Threading.Tasks.Internal;
- using System.Threading;
- namespace Cysharp.Threading.Tasks.Linq
- {
- public static partial class UniTaskAsyncEnumerable
- {
- public static IUniTaskAsyncEnumerable<TElement> Repeat<TElement>(TElement element, int count)
- {
- if (count < 0) throw Error.ArgumentOutOfRange(nameof(count));
- return new Repeat<TElement>(element, count);
- }
- }
- internal class Repeat<TElement> : IUniTaskAsyncEnumerable<TElement>
- {
- readonly TElement element;
- readonly int count;
- public Repeat(TElement element, int count)
- {
- this.element = element;
- this.count = count;
- }
- public IUniTaskAsyncEnumerator<TElement> GetAsyncEnumerator(CancellationToken cancellationToken = default)
- {
- return new _Repeat(element, count, cancellationToken);
- }
- class _Repeat : IUniTaskAsyncEnumerator<TElement>
- {
- readonly TElement element;
- readonly int count;
- int remaining;
- CancellationToken cancellationToken;
- public _Repeat(TElement element, int count, CancellationToken cancellationToken)
- {
- this.element = element;
- this.count = count;
- this.cancellationToken = cancellationToken;
- this.remaining = count;
- }
- public TElement Current => element;
- public UniTask<bool> MoveNextAsync()
- {
- cancellationToken.ThrowIfCancellationRequested();
- if (remaining-- != 0)
- {
- return CompletedTasks.True;
- }
- return CompletedTasks.False;
- }
- public UniTask DisposeAsync()
- {
- return default;
- }
- }
- }
- }
|