Where.Opt.Generated.tt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT 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. #if REFERENCE_ASSEMBLY
  18. public static partial class AsyncEnumerableDeprecated
  19. #else
  20. public static partial class AsyncEnumerable
  21. #endif
  22. {
  23. <#
  24. for (var i = 2; i <= maxCombine; i++)
  25. {
  26. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "_predicate" + j + "(x)"));
  27. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, bool> predicate" + j));
  28. #>
  29. private sealed class CombinedPredicates<#=i#><TSource> : ICombinedPredicates<TSource>
  30. {
  31. <#
  32. for (var j = 1; j <= i; j++)
  33. {
  34. #>
  35. private readonly Func<TSource, bool> _predicate<#=j#>;
  36. <#
  37. }
  38. #>
  39. public CombinedPredicates<#=i#>(<#=allPreds#>)
  40. {
  41. <#
  42. for (var j = 1; j <= i; j++)
  43. {
  44. #>
  45. _predicate<#=j#> = predicate<#=j#>;
  46. <#
  47. }
  48. #>
  49. }
  50. public ICombinedPredicates<TSource> And(Func<TSource, bool> predicate) =>
  51. new CombinedPredicates<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  52. <#
  53. for (var j = 1; j <= i; j++)
  54. {
  55. #>
  56. _predicate<#=j#>,
  57. <#
  58. }
  59. #>
  60. predicate
  61. );
  62. public bool Invoke(TSource x) => <#=applyAll#>;
  63. }
  64. <#
  65. }
  66. #>
  67. <#
  68. for (var i = 2; i <= maxCombine; i++)
  69. {
  70. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "await _predicate" + j + "(x).ConfigureAwait(false)"));
  71. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, ValueTask<bool>> predicate" + j));
  72. #>
  73. private sealed class CombinedAsyncPredicates<#=i#><TSource> : ICombinedAsyncPredicates<TSource>
  74. {
  75. <#
  76. for (var j = 1; j <= i; j++)
  77. {
  78. #>
  79. private readonly Func<TSource, ValueTask<bool>> _predicate<#=j#>;
  80. <#
  81. }
  82. #>
  83. public CombinedAsyncPredicates<#=i#>(<#=allPreds#>)
  84. {
  85. <#
  86. for (var j = 1; j <= i; j++)
  87. {
  88. #>
  89. _predicate<#=j#> = predicate<#=j#>;
  90. <#
  91. }
  92. #>
  93. }
  94. public ICombinedAsyncPredicates<TSource> And(Func<TSource, ValueTask<bool>> predicate) =>
  95. new CombinedAsyncPredicates<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  96. <#
  97. for (var j = 1; j <= i; j++)
  98. {
  99. #>
  100. _predicate<#=j#>,
  101. <#
  102. }
  103. #>
  104. predicate
  105. );
  106. public async ValueTask<bool> Invoke(TSource x) => <#=applyAll#>;
  107. }
  108. <#
  109. }
  110. #>
  111. #if !NO_DEEP_CANCELLATION
  112. <#
  113. for (var i = 2; i <= maxCombine; i++)
  114. {
  115. var applyAll = string.Join(" && ", Enumerable.Range(1, i).Select(j => "await _predicate" + j + "(x, ct).ConfigureAwait(false)"));
  116. var allPreds = string.Join(", ", Enumerable.Range(1, i).Select(j => "Func<TSource, CancellationToken, ValueTask<bool>> predicate" + j));
  117. #>
  118. private sealed class CombinedAsyncPredicatesWithCancellation<#=i#><TSource> : ICombinedAsyncPredicatesWithCancellation<TSource>
  119. {
  120. <#
  121. for (var j = 1; j <= i; j++)
  122. {
  123. #>
  124. private readonly Func<TSource, CancellationToken, ValueTask<bool>> _predicate<#=j#>;
  125. <#
  126. }
  127. #>
  128. public CombinedAsyncPredicatesWithCancellation<#=i#>(<#=allPreds#>)
  129. {
  130. <#
  131. for (var j = 1; j <= i; j++)
  132. {
  133. #>
  134. _predicate<#=j#> = predicate<#=j#>;
  135. <#
  136. }
  137. #>
  138. }
  139. public ICombinedAsyncPredicatesWithCancellation<TSource> And(Func<TSource, CancellationToken, ValueTask<bool>> predicate) =>
  140. new CombinedAsyncPredicatesWithCancellation<#=i == maxCombine ? "N" : (i + 1).ToString()#><TSource>(
  141. <#
  142. for (var j = 1; j <= i; j++)
  143. {
  144. #>
  145. _predicate<#=j#>,
  146. <#
  147. }
  148. #>
  149. predicate
  150. );
  151. public async ValueTask<bool> Invoke(TSource x, CancellationToken ct) => <#=applyAll#>;
  152. }
  153. <#
  154. }
  155. #>
  156. #endif
  157. }
  158. }