Select.Opt.cs 2.8 KB

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