// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT 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 CombinedPredicates2 : ICombinedPredicates { private readonly Func _predicate1; private readonly Func _predicate2; public CombinedPredicates2(Func predicate1, Func predicate2) { _predicate1 = predicate1; _predicate2 = predicate2; } public ICombinedPredicates And(Func predicate) => new CombinedPredicates3( _predicate1, _predicate2, predicate ); public bool Invoke(TSource x) => _predicate1(x) && _predicate2(x); } private sealed class CombinedPredicates3 : ICombinedPredicates { private readonly Func _predicate1; private readonly Func _predicate2; private readonly Func _predicate3; public CombinedPredicates3(Func predicate1, Func predicate2, Func predicate3) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; } public ICombinedPredicates And(Func predicate) => new CombinedPredicates4( _predicate1, _predicate2, _predicate3, predicate ); public bool Invoke(TSource x) => _predicate1(x) && _predicate2(x) && _predicate3(x); } private sealed class CombinedPredicates4 : ICombinedPredicates { private readonly Func _predicate1; private readonly Func _predicate2; private readonly Func _predicate3; private readonly Func _predicate4; public CombinedPredicates4(Func predicate1, Func predicate2, Func predicate3, Func predicate4) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; _predicate4 = predicate4; } public ICombinedPredicates And(Func predicate) => new CombinedPredicatesN( _predicate1, _predicate2, _predicate3, _predicate4, predicate ); public bool Invoke(TSource x) => _predicate1(x) && _predicate2(x) && _predicate3(x) && _predicate4(x); } private sealed class CombinedAsyncPredicates2 : ICombinedAsyncPredicates { private readonly Func> _predicate1; private readonly Func> _predicate2; public CombinedAsyncPredicates2(Func> predicate1, Func> predicate2) { _predicate1 = predicate1; _predicate2 = predicate2; } public ICombinedAsyncPredicates And(Func> predicate) => new CombinedAsyncPredicates3( _predicate1, _predicate2, predicate ); public async ValueTask Invoke(TSource x) => await _predicate1(x).ConfigureAwait(false) && await _predicate2(x).ConfigureAwait(false); } private sealed class CombinedAsyncPredicates3 : ICombinedAsyncPredicates { private readonly Func> _predicate1; private readonly Func> _predicate2; private readonly Func> _predicate3; public CombinedAsyncPredicates3(Func> predicate1, Func> predicate2, Func> predicate3) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; } public ICombinedAsyncPredicates And(Func> predicate) => new CombinedAsyncPredicates4( _predicate1, _predicate2, _predicate3, predicate ); public async ValueTask Invoke(TSource x) => await _predicate1(x).ConfigureAwait(false) && await _predicate2(x).ConfigureAwait(false) && await _predicate3(x).ConfigureAwait(false); } private sealed class CombinedAsyncPredicates4 : ICombinedAsyncPredicates { private readonly Func> _predicate1; private readonly Func> _predicate2; private readonly Func> _predicate3; private readonly Func> _predicate4; public CombinedAsyncPredicates4(Func> predicate1, Func> predicate2, Func> predicate3, Func> predicate4) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; _predicate4 = predicate4; } public ICombinedAsyncPredicates And(Func> predicate) => new CombinedAsyncPredicatesN( _predicate1, _predicate2, _predicate3, _predicate4, predicate ); public async ValueTask Invoke(TSource x) => await _predicate1(x).ConfigureAwait(false) && await _predicate2(x).ConfigureAwait(false) && await _predicate3(x).ConfigureAwait(false) && await _predicate4(x).ConfigureAwait(false); } #if !NO_DEEP_CANCELLATION private sealed class CombinedAsyncPredicatesWithCancellation2 : ICombinedAsyncPredicatesWithCancellation { private readonly Func> _predicate1; private readonly Func> _predicate2; public CombinedAsyncPredicatesWithCancellation2(Func> predicate1, Func> predicate2) { _predicate1 = predicate1; _predicate2 = predicate2; } public ICombinedAsyncPredicatesWithCancellation And(Func> predicate) => new CombinedAsyncPredicatesWithCancellation3( _predicate1, _predicate2, predicate ); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _predicate1(x, ct).ConfigureAwait(false) && await _predicate2(x, ct).ConfigureAwait(false); } private sealed class CombinedAsyncPredicatesWithCancellation3 : ICombinedAsyncPredicatesWithCancellation { private readonly Func> _predicate1; private readonly Func> _predicate2; private readonly Func> _predicate3; public CombinedAsyncPredicatesWithCancellation3(Func> predicate1, Func> predicate2, Func> predicate3) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; } public ICombinedAsyncPredicatesWithCancellation And(Func> predicate) => new CombinedAsyncPredicatesWithCancellation4( _predicate1, _predicate2, _predicate3, predicate ); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _predicate1(x, ct).ConfigureAwait(false) && await _predicate2(x, ct).ConfigureAwait(false) && await _predicate3(x, ct).ConfigureAwait(false); } private sealed class CombinedAsyncPredicatesWithCancellation4 : ICombinedAsyncPredicatesWithCancellation { private readonly Func> _predicate1; private readonly Func> _predicate2; private readonly Func> _predicate3; private readonly Func> _predicate4; public CombinedAsyncPredicatesWithCancellation4(Func> predicate1, Func> predicate2, Func> predicate3, Func> predicate4) { _predicate1 = predicate1; _predicate2 = predicate2; _predicate3 = predicate3; _predicate4 = predicate4; } public ICombinedAsyncPredicatesWithCancellation And(Func> predicate) => new CombinedAsyncPredicatesWithCancellationN( _predicate1, _predicate2, _predicate3, _predicate4, predicate ); public async ValueTask Invoke(TSource x, CancellationToken ct) => await _predicate1(x, ct).ConfigureAwait(false) && await _predicate2(x, ct).ConfigureAwait(false) && await _predicate3(x, ct).ConfigureAwait(false) && await _predicate4(x, ct).ConfigureAwait(false); } #endif } }