Select.Opt.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace System.Linq
  7. {
  8. #if REFERENCE_ASSEMBLY
  9. public static partial class AsyncEnumerableDeprecated
  10. #else
  11. public static partial class AsyncEnumerable
  12. #endif
  13. {
  14. private static Func<TSource, TResult> CombineSelectors<TSource, TMiddle, TResult>(Func<TSource, TMiddle> selector1, Func<TMiddle, TResult> selector2)
  15. {
  16. if (selector1.Target is ICombinedSelectors<TSource, TMiddle> c)
  17. {
  18. return c.Combine(selector2).Invoke;
  19. }
  20. else
  21. {
  22. return new CombinedSelectors2<TSource, TMiddle, TResult>(selector1, selector2).Invoke;
  23. }
  24. }
  25. private interface ICombinedSelectors<TSource, TResult>
  26. {
  27. ICombinedSelectors<TSource, TNewResult> Combine<TNewResult>(Func<TResult, TNewResult> selector);
  28. TResult Invoke(TSource x);
  29. }
  30. private static Func<TSource, ValueTask<TResult>> CombineSelectors<TSource, TMiddle, TResult>(Func<TSource, ValueTask<TMiddle>> selector1, Func<TMiddle, ValueTask<TResult>> selector2)
  31. {
  32. if (selector1.Target is ICombinedAsyncSelectors<TSource, TMiddle> c)
  33. {
  34. return c.Combine(selector2).Invoke;
  35. }
  36. else
  37. {
  38. return new CombinedAsyncSelectors2<TSource, TMiddle, TResult>(selector1, selector2).Invoke;
  39. }
  40. }
  41. private interface ICombinedAsyncSelectors<TSource, TResult>
  42. {
  43. ICombinedAsyncSelectors<TSource, TNewResult> Combine<TNewResult>(Func<TResult, ValueTask<TNewResult>> selector);
  44. ValueTask<TResult> Invoke(TSource x);
  45. }
  46. #if !NO_DEEP_CANCELLATION
  47. private static Func<TSource, CancellationToken, ValueTask<TResult>> CombineSelectors<TSource, TMiddle, TResult>(Func<TSource, CancellationToken, ValueTask<TMiddle>> selector1, Func<TMiddle, CancellationToken, ValueTask<TResult>> selector2)
  48. {
  49. if (selector1.Target is ICombinedAsyncSelectorsWithCancellation<TSource, TMiddle> c)
  50. {
  51. return c.Combine(selector2).Invoke;
  52. }
  53. else
  54. {
  55. return new CombinedAsyncSelectorsWithCancellation2<TSource, TMiddle, TResult>(selector1, selector2).Invoke;
  56. }
  57. }
  58. private interface ICombinedAsyncSelectorsWithCancellation<TSource, TResult>
  59. {
  60. ICombinedAsyncSelectorsWithCancellation<TSource, TNewResult> Combine<TNewResult>(Func<TResult, CancellationToken, ValueTask<TNewResult>> selector);
  61. ValueTask<TResult> Invoke(TSource x, CancellationToken ct);
  62. }
  63. #endif
  64. }
  65. }