61 lines
1.8 KiB
C#
61 lines
1.8 KiB
C#
using Cysharp.Threading.Tasks.Internal;
|
|
using System;
|
|
using System.Threading;
|
|
|
|
namespace Cysharp.Threading.Tasks.Linq
|
|
{
|
|
public static partial class UniTaskAsyncEnumerable
|
|
{
|
|
public static IUniTaskAsyncEnumerable<TResult> OfType<TResult>(this IUniTaskAsyncEnumerable<Object> source)
|
|
{
|
|
Error.ThrowArgumentNullException(source, nameof(source));
|
|
|
|
return new OfType<TResult>(source);
|
|
}
|
|
}
|
|
|
|
internal sealed class OfType<TResult> : IUniTaskAsyncEnumerable<TResult>
|
|
{
|
|
readonly IUniTaskAsyncEnumerable<object> source;
|
|
|
|
public OfType(IUniTaskAsyncEnumerable<object> source)
|
|
{
|
|
this.source = source;
|
|
}
|
|
|
|
public IUniTaskAsyncEnumerator<TResult> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
|
{
|
|
return new _OfType(source, cancellationToken);
|
|
}
|
|
|
|
class _OfType : AsyncEnumeratorBase<object, TResult>
|
|
{
|
|
public _OfType(IUniTaskAsyncEnumerable<object> source, CancellationToken cancellationToken)
|
|
|
|
: base(source, cancellationToken)
|
|
{
|
|
}
|
|
|
|
protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result)
|
|
{
|
|
if (sourceHasCurrent)
|
|
{
|
|
if (SourceCurrent is TResult castCurent)
|
|
{
|
|
Current = castCurent;
|
|
result = true;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
result = default;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
result = false;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
} |