Where.Opt.Generated.tt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. <#@ template debug="false" hostspecific="false" language="C#" #>
  5. <#@ assembly name="System.Core" #>
  6. <#@ import namespace="System.Linq" #>
  7. <#@ import namespace="System.Text" #>
  8. <#@ import namespace="System.Collections.Generic" #>
  9. <#@ output extension=".cs" #>
  10. <#
  11. int maxCombine = 4;
  12. #>
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. namespace System.Linq
  16. {
  17. public static partial class AsyncEnumerable
  18. {
  19. <#
  20. for (var i = 2; i <= maxCombine; i++)
  21. {
  22. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "_predicate" + j + "(x)"));
  23. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, bool> predicate" + j));
  24. #>
  25. private sealed class CombinedPredicates<#=i#><TSource> : ICombinedPredicates<TSource>
  26. {
  27. <#
  28. for (var j = 1; j <= i; j++)
  29. {
  30. #>
  31. private readonly Func<TSource, bool> _predicate<#=j#>;
  32. <#
  33. }
  34. #>
  35. public CombinedPredicates<#=i#>(<#=allPreds#>)
  36. {
  37. <#
  38. for (var j = 1; j <= i; j++)
  39. {
  40. #>
  41. _predicate<#=j#> = predicate<#=j#>;
  42. <#
  43. }
  44. #>
  45. }
  46. public ICombinedPredicates<TSource> And(Func<TSource, bool> predicate) =>
  47. new CombinedPredicates<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  48. <#
  49. for (var j = 1; j <= i; j++)
  50. {
  51. #>
  52. _predicate<#=j#>,
  53. <#
  54. }
  55. #>
  56. predicate
  57. );
  58. public bool Invoke(TSource x) => <#=applyAll#>;
  59. }
  60. <#
  61. }
  62. #>
  63. <#
  64. for (var i = 2; i <= maxCombine; i++)
  65. {
  66. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "await _predicate" + j + "(x).ConfigureAwait(false)"));
  67. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, ValueTask<bool>> predicate" + j));
  68. #>
  69. private sealed class CombinedAsyncPredicates<#=i#><TSource> : ICombinedAsyncPredicates<TSource>
  70. {
  71. <#
  72. for (var j = 1; j <= i; j++)
  73. {
  74. #>
  75. private readonly Func<TSource, ValueTask<bool>> _predicate<#=j#>;
  76. <#
  77. }
  78. #>
  79. public CombinedAsyncPredicates<#=i#>(<#=allPreds#>)
  80. {
  81. <#
  82. for (var j = 1; j <= i; j++)
  83. {
  84. #>
  85. _predicate<#=j#> = predicate<#=j#>;
  86. <#
  87. }
  88. #>
  89. }
  90. public ICombinedAsyncPredicates<TSource> And(Func<TSource, ValueTask<bool>> predicate) =>
  91. new CombinedAsyncPredicates<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  92. <#
  93. for (var j = 1; j <= i; j++)
  94. {
  95. #>
  96. _predicate<#=j#>,
  97. <#
  98. }
  99. #>
  100. predicate
  101. );
  102. public async ValueTask<bool> Invoke(TSource x) => <#=applyAll#>;
  103. }
  104. <#
  105. }
  106. #>
  107. #if !NO_DEEP_CANCELLATION
  108. <#
  109. for (var i = 2; i <= maxCombine; i++)
  110. {
  111. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "await _predicate" + j + "(x, ct).ConfigureAwait(false)"));
  112. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, CancellationToken, ValueTask<bool>> predicate" + j));
  113. #>
  114. private sealed class CombinedAsyncPredicatesWithCancellation<#=i#><TSource> : ICombinedAsyncPredicatesWithCancellation<TSource>
  115. {
  116. <#
  117. for (var j = 1; j <= i; j++)
  118. {
  119. #>
  120. private readonly Func<TSource, CancellationToken, ValueTask<bool>> _predicate<#=j#>;
  121. <#
  122. }
  123. #>
  124. public CombinedAsyncPredicatesWithCancellation<#=i#>(<#=allPreds#>)
  125. {
  126. <#
  127. for (var j = 1; j <= i; j++)
  128. {
  129. #>
  130. _predicate<#=j#> = predicate<#=j#>;
  131. <#
  132. }
  133. #>
  134. }
  135. public ICombinedAsyncPredicatesWithCancellation<TSource> And(Func<TSource, CancellationToken, ValueTask<bool>> predicate) =>
  136. new CombinedAsyncPredicatesWithCancellation<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  137. <#
  138. for (var j = 1; j <= i; j++)
  139. {
  140. #>
  141. _predicate<#=j#>,
  142. <#
  143. }
  144. #>
  145. predicate
  146. );
  147. public async ValueTask<bool> Invoke(TSource x, CancellationToken ct) => <#=applyAll#>;
  148. }
  149. <#
  150. }
  151. #>
  152. #endif
  153. }
  154. }