|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|