You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.0 KiB
C#
91 lines
3.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading;
|
|
|
|
namespace Cysharp.Threading.Tasks
|
|
{
|
|
public interface IUniTaskAsyncEnumerable<out T>
|
|
{
|
|
IUniTaskAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default);
|
|
}
|
|
|
|
public interface IUniTaskAsyncEnumerator<out T> : IUniTaskAsyncDisposable
|
|
{
|
|
T Current { get; }
|
|
UniTask<bool> MoveNextAsync();
|
|
}
|
|
|
|
public interface IUniTaskAsyncDisposable
|
|
{
|
|
UniTask DisposeAsync();
|
|
}
|
|
|
|
public interface IUniTaskOrderedAsyncEnumerable<TElement> : IUniTaskAsyncEnumerable<TElement>
|
|
{
|
|
IUniTaskOrderedAsyncEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer, bool descending);
|
|
IUniTaskOrderedAsyncEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, UniTask<TKey>> keySelector, IComparer<TKey> comparer, bool descending);
|
|
IUniTaskOrderedAsyncEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, CancellationToken, UniTask<TKey>> keySelector, IComparer<TKey> comparer, bool descending);
|
|
}
|
|
|
|
public interface IConnectableUniTaskAsyncEnumerable<out T> : IUniTaskAsyncEnumerable<T>
|
|
{
|
|
IDisposable Connect();
|
|
}
|
|
|
|
// don't use AsyncGrouping.
|
|
//public interface IUniTaskAsyncGrouping<out TKey, out TElement> : IUniTaskAsyncEnumerable<TElement>
|
|
//{
|
|
// TKey Key { get; }
|
|
//}
|
|
|
|
public static class UniTaskAsyncEnumerableExtensions
|
|
{
|
|
public static UniTaskCancelableAsyncEnumerable<T> WithCancellation<T>(this IUniTaskAsyncEnumerable<T> source, CancellationToken cancellationToken)
|
|
{
|
|
return new UniTaskCancelableAsyncEnumerable<T>(source, cancellationToken);
|
|
}
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Auto)]
|
|
public readonly struct UniTaskCancelableAsyncEnumerable<T>
|
|
{
|
|
private readonly IUniTaskAsyncEnumerable<T> enumerable;
|
|
private readonly CancellationToken cancellationToken;
|
|
|
|
internal UniTaskCancelableAsyncEnumerable(IUniTaskAsyncEnumerable<T> enumerable, CancellationToken cancellationToken)
|
|
{
|
|
this.enumerable = enumerable;
|
|
this.cancellationToken = cancellationToken;
|
|
}
|
|
|
|
public Enumerator GetAsyncEnumerator()
|
|
{
|
|
return new Enumerator(enumerable.GetAsyncEnumerator(cancellationToken));
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Auto)]
|
|
public readonly struct Enumerator
|
|
{
|
|
private readonly IUniTaskAsyncEnumerator<T> enumerator;
|
|
|
|
internal Enumerator(IUniTaskAsyncEnumerator<T> enumerator)
|
|
{
|
|
this.enumerator = enumerator;
|
|
}
|
|
|
|
public T Current => enumerator.Current;
|
|
|
|
public UniTask<bool> MoveNextAsync()
|
|
{
|
|
return enumerator.MoveNextAsync();
|
|
}
|
|
|
|
|
|
public UniTask DisposeAsync()
|
|
{
|
|
return enumerator.DisposeAsync();
|
|
}
|
|
}
|
|
}
|
|
} |