You can not 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
91 lines
3.0 KiB
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(); |
|
} |
|
} |
|
} |
|
} |