Files
UniTask/src/UniTask.NetCore/Linq/Cast.cs

53 lines
1.5 KiB
C#
Raw Normal View History

2020-05-10 22:44:40 +09:00
using Cysharp.Threading.Tasks.Internal;
using System;
using System.Threading;
namespace Cysharp.Threading.Tasks.Linq
2020-05-08 03:23:14 +09:00
{
2020-05-10 22:44:40 +09:00
public static partial class UniTaskAsyncEnumerable
2020-05-08 03:23:14 +09:00
{
2020-05-10 22:44:40 +09:00
public static IUniTaskAsyncEnumerable<TResult> Cast<TResult>(this IUniTaskAsyncEnumerable<Object> source)
{
Error.ThrowArgumentNullException(source, nameof(source));
2020-05-08 03:23:14 +09:00
2020-05-10 22:44:40 +09:00
return new Cast<TResult>(source);
}
}
2020-05-08 03:23:14 +09:00
2020-05-10 22:44:40 +09:00
internal sealed class Cast<TResult> : IUniTaskAsyncEnumerable<TResult>
{
readonly IUniTaskAsyncEnumerable<object> source;
public Cast(IUniTaskAsyncEnumerable<object> source)
{
this.source = source;
}
public IUniTaskAsyncEnumerator<TResult> GetAsyncEnumerator(CancellationToken cancellationToken = default)
{
return new Enumerator(source, cancellationToken);
}
class Enumerator : AsyncEnumeratorBase<object, TResult>
{
public Enumerator(IUniTaskAsyncEnumerable<object> source, CancellationToken cancellationToken)
: base(source, cancellationToken)
{
}
protected override bool TryMoveNextCore(bool sourceHasCurrent, out bool result)
{
if (sourceHasCurrent)
{
Current = (TResult)SourceCurrent;
result = true;
return true;
}
result = false;
return true;
}
}
}
}