// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System.Threading; using System.Threading.Tasks; namespace System.Linq { public static partial class AsyncEnumerable { private sealed class CombinedSelectors2 : ICombinedSelectors { private readonly Func _selector1; private readonly Func _selector2; public CombinedSelectors2(Func selector1, Func selector2) { _selector1 = selector1; _selector2 = selector2; } public ICombinedSelectors Combine(Func selector) => new CombinedSelectors3( _selector1, _selector2, selector ); public TResult Invoke(TSource x) => _selector2(_selector1(x)); } private sealed class CombinedSelectors3 : ICombinedSelectors { private readonly Func _selector1; private readonly Func _selector2; private readonly Func _selector3; public CombinedSelectors3(Func selector1, Func selector2, Func selector3) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; } public ICombinedSelectors Combine(Func selector) => new CombinedSelectors4( _selector1, _selector2, _selector3, selector ); public TResult Invoke(TSource x) => _selector3(_selector2(_selector1(x))); } private sealed class CombinedSelectors4 : ICombinedSelectors { private readonly Func _selector1; private readonly Func _selector2; private readonly Func _selector3; private readonly Func _selector4; public CombinedSelectors4(Func selector1, Func selector2, Func selector3, Func selector4) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; _selector4 = selector4; } public ICombinedSelectors Combine(Func selector) => new CombinedSelectors2(this.Invoke, selector); public TResult Invoke(TSource x) => _selector4(_selector3(_selector2(_selector1(x)))); } private sealed class CombinedAsyncSelectors2 : ICombinedAsyncSelectors { private readonly Func> _selector1; private readonly Func> _selector2; public CombinedAsyncSelectors2(Func> selector1, Func> selector2) { _selector1 = selector1; _selector2 = selector2; } public ICombinedAsyncSelectors Combine(Func> selector) => new CombinedAsyncSelectors3( _selector1, _selector2, selector ); public async ValueTask Invoke(TSource x) => await _selector2(await _selector1(x).ConfigureAwait(false)).ConfigureAwait(false); } private sealed class CombinedAsyncSelectors3 : ICombinedAsyncSelectors { private readonly Func> _selector1; private readonly Func> _selector2; private readonly Func> _selector3; public CombinedAsyncSelectors3(Func> selector1, Func> selector2, Func> selector3) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; } public ICombinedAsyncSelectors Combine(Func> selector) => new CombinedAsyncSelectors4( _selector1, _selector2, _selector3, selector ); public async ValueTask Invoke(TSource x) => await _selector3(await _selector2(await _selector1(x).ConfigureAwait(false)).ConfigureAwait(false)).ConfigureAwait(false); } private sealed class CombinedAsyncSelectors4 : ICombinedAsyncSelectors { private readonly Func> _selector1; private readonly Func> _selector2; private readonly Func> _selector3; private readonly Func> _selector4; public CombinedAsyncSelectors4(Func> selector1, Func> selector2, Func> selector3, Func> selector4) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; _selector4 = selector4; } public ICombinedAsyncSelectors Combine(Func> selector) => new CombinedAsyncSelectors2(this.Invoke, selector); public async ValueTask Invoke(TSource x) => await _selector4(await _selector3(await _selector2(await _selector1(x).ConfigureAwait(false)).ConfigureAwait(false)).ConfigureAwait(false)).ConfigureAwait(false); } #if !NO_DEEP_CANCELLATION private sealed class CombinedAsyncSelectorsWithCancellation2 : ICombinedAsyncSelectorsWithCancellation { private readonly Func> _selector1; private readonly Func> _selector2; public CombinedAsyncSelectorsWithCancellation2(Func> selector1, Func> selector2) { _selector1 = selector1; _selector2 = selector2; } public ICombinedAsyncSelectorsWithCancellation Combine(Func> selector) => new CombinedAsyncSelectorsWithCancellation3( _selector1, _selector2, selector ); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _selector2(await _selector1(x, ct).ConfigureAwait(false), ct).ConfigureAwait(false); } private sealed class CombinedAsyncSelectorsWithCancellation3 : ICombinedAsyncSelectorsWithCancellation { private readonly Func> _selector1; private readonly Func> _selector2; private readonly Func> _selector3; public CombinedAsyncSelectorsWithCancellation3(Func> selector1, Func> selector2, Func> selector3) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; } public ICombinedAsyncSelectorsWithCancellation Combine(Func> selector) => new CombinedAsyncSelectorsWithCancellation4( _selector1, _selector2, _selector3, selector ); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _selector3(await _selector2(await _selector1(x, ct).ConfigureAwait(false), ct).ConfigureAwait(false), ct).ConfigureAwait(false); } private sealed class CombinedAsyncSelectorsWithCancellation4 : ICombinedAsyncSelectorsWithCancellation { private readonly Func> _selector1; private readonly Func> _selector2; private readonly Func> _selector3; private readonly Func> _selector4; public CombinedAsyncSelectorsWithCancellation4(Func> selector1, Func> selector2, Func> selector3, Func> selector4) { _selector1 = selector1; _selector2 = selector2; _selector3 = selector3; _selector4 = selector4; } public ICombinedAsyncSelectorsWithCancellation Combine(Func> selector) => new CombinedAsyncSelectorsWithCancellation2(this.Invoke, selector); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _selector4(await _selector3(await _selector2(await _selector1(x, ct).ConfigureAwait(false), ct).ConfigureAwait(false), ct).ConfigureAwait(false), ct).ConfigureAwait(false); } #endif } }