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