FromAsyncPattern.Generated.tt 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. using System.Reactive.Subjects;
  11. namespace System.Reactive.Linq
  12. {
  13. // REVIEW: Consider if these are worth retaining in the async space.
  14. partial class AsyncObservable
  15. {
  16. <#
  17. for (var i = 0; i <= 14; i++)
  18. {
  19. var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<TResult>" });
  20. var ret = "Func<" + string.Join(", ", args) + ">";
  21. var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "TResult" }));
  22. var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));
  23. var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";
  24. var end = "Func<IAsyncResult, TResult>";
  25. #>
  26. public static <#=ret#> FromAsyncPattern<<#=genArgs#>>(<#=begin#> begin, <#=end#> end)
  27. {
  28. if (begin == null)
  29. throw new ArgumentNullException(nameof(begin));
  30. if (end == null)
  31. throw new ArgumentNullException(nameof(end));
  32. return (<#=pars#>) =>
  33. {
  34. var subject = new SequentialAsyncAsyncSubject<TResult>();
  35. try
  36. {
  37. begin(<#=pars + (i > 0 ? ", " : "")#>async iar =>
  38. {
  39. TResult result;
  40. try
  41. {
  42. result = end(iar);
  43. }
  44. catch (Exception ex)
  45. {
  46. await subject.OnErrorAsync(ex).ConfigureAwait(false);
  47. return;
  48. }
  49. await subject.OnNextAsync(result).ConfigureAwait(false);
  50. await subject.OnCompletedAsync().ConfigureAwait(false);
  51. }, null);
  52. }
  53. catch (Exception ex)
  54. {
  55. return Throw<TResult>(ex);
  56. }
  57. return subject.AsAsyncObservable();
  58. };
  59. }
  60. <#
  61. }
  62. #>
  63. <#
  64. for (var i = 0; i <= 14; i++)
  65. {
  66. var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<Unit>" });
  67. var ret = "Func<" + string.Join(", ", args) + ">";
  68. var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
  69. var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));
  70. var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";
  71. var end = "Func<IAsyncResult, Unit>";
  72. if (genArgs != "")
  73. {
  74. genArgs = "<" + genArgs + ">";
  75. }
  76. #>
  77. public static <#=ret#> FromAsyncPattern<#=genArgs#>(<#=begin#> begin, <#=end#> end)
  78. {
  79. if (begin == null)
  80. throw new ArgumentNullException(nameof(begin));
  81. if (end == null)
  82. throw new ArgumentNullException(nameof(end));
  83. return FromAsyncPattern(begin, iar =>
  84. {
  85. end(iar);
  86. return Unit.Default;
  87. });
  88. }
  89. <#
  90. }
  91. #>
  92. }
  93. }