FromAsyncPattern.Generated.tt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. using System.Reactive.Subjects;
  11. namespace System.Reactive.Linq
  12. {
  13. // REVIEW: Consider if these are worth retaining in the async space.
  14. public 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. var invokeArgs = pars;
  26. if (i > 0)
  27. {
  28. invokeArgs = ", " + invokeArgs;
  29. }
  30. #>
  31. public static <#=ret#> FromAsyncPattern<<#=genArgs#>>(<#=begin#> begin, <#=end#> end)
  32. {
  33. if (begin == null)
  34. throw new ArgumentNullException(nameof(begin));
  35. if (end == null)
  36. throw new ArgumentNullException(nameof(end));
  37. return (<#=pars#>) =>
  38. {
  39. var subject = new SequentialAsyncAsyncSubject<TResult>();
  40. try
  41. {
  42. AsyncObserver.FromAsyncPattern(subject, begin, end<#=invokeArgs#>);
  43. }
  44. catch (Exception ex)
  45. {
  46. return Throw<TResult>(ex);
  47. }
  48. return subject.AsAsyncObservable();
  49. };
  50. }
  51. <#
  52. }
  53. #>
  54. <#
  55. for (var i = 0; i <= 14; i++)
  56. {
  57. var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<Unit>" });
  58. var ret = "Func<" + string.Join(", ", args) + ">";
  59. var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
  60. var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));
  61. var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";
  62. var end = "Func<IAsyncResult, Unit>";
  63. if (genArgs != "")
  64. {
  65. genArgs = "<" + genArgs + ">";
  66. }
  67. var invokeArgs = pars;
  68. if (i > 0)
  69. {
  70. invokeArgs = ", " + invokeArgs;
  71. }
  72. #>
  73. public static <#=ret#> FromAsyncPattern<#=genArgs#>(<#=begin#> begin, <#=end#> end)
  74. {
  75. if (begin == null)
  76. throw new ArgumentNullException(nameof(begin));
  77. if (end == null)
  78. throw new ArgumentNullException(nameof(end));
  79. return (<#=pars#>) =>
  80. {
  81. var subject = new SequentialAsyncAsyncSubject<Unit>();
  82. try
  83. {
  84. AsyncObserver.FromAsyncPattern(subject, begin, end<#=invokeArgs#>);
  85. }
  86. catch (Exception ex)
  87. {
  88. return Throw<Unit>(ex);
  89. }
  90. return subject.AsAsyncObservable();
  91. };
  92. }
  93. <#
  94. }
  95. #>
  96. }
  97. public partial class AsyncObserver
  98. {
  99. <#
  100. for (var i = 0; i <= 14; i++)
  101. {
  102. var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<TResult>" });
  103. var ret = "Func<" + string.Join(", ", args) + ">";
  104. var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "TResult" }));
  105. var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));
  106. var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";
  107. var end = "Func<IAsyncResult, TResult>";
  108. var invokePars = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j + " arg" + j));
  109. if (i > 0)
  110. {
  111. invokePars = ", " + invokePars;
  112. }
  113. #>
  114. public static IAsyncResult FromAsyncPattern<<#=genArgs#>>(IAsyncObserver<TResult> observer, <#=begin#> begin, <#=end#> end<#=invokePars#>)
  115. {
  116. if (observer == null)
  117. throw new ArgumentNullException(nameof(observer));
  118. if (begin == null)
  119. throw new ArgumentNullException(nameof(begin));
  120. if (end == null)
  121. throw new ArgumentNullException(nameof(end));
  122. return begin(<#=pars + (i > 0 ? ", " : "")#>async iar =>
  123. {
  124. TResult result;
  125. try
  126. {
  127. result = end(iar);
  128. }
  129. catch (Exception ex)
  130. {
  131. await observer.OnErrorAsync(ex).ConfigureAwait(false);
  132. return;
  133. }
  134. await observer.OnNextAsync(result).ConfigureAwait(false);
  135. await observer.OnCompletedAsync().ConfigureAwait(false);
  136. }, null);
  137. }
  138. <#
  139. }
  140. #>
  141. <#
  142. for (var i = 0; i <= 14; i++)
  143. {
  144. var args = Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "IAsyncObservable<Unit>" });
  145. var ret = "Func<" + string.Join(", ", args) + ">";
  146. var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
  147. var pars = string.Join(", ", Enumerable.Range(1, i).Select(j => "arg" + j));
  148. var begin = "Func<" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j).Concat(new[] { "AsyncCallback, object, IAsyncResult" })) + ">";
  149. var end = "Func<IAsyncResult, Unit>";
  150. if (genArgs != "")
  151. {
  152. genArgs = "<" + genArgs + ">";
  153. }
  154. var invokePars = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j + " arg" + j));
  155. var invokeArgs = pars;
  156. if (i > 0)
  157. {
  158. invokePars = ", " + invokePars;
  159. invokeArgs = ", " + invokeArgs;
  160. }
  161. #>
  162. public static IAsyncResult FromAsyncPattern<#=genArgs#>(IAsyncObserver<Unit> observer, <#=begin#> begin, <#=end#> end<#=invokePars#>)
  163. {
  164. if (observer == null)
  165. throw new ArgumentNullException(nameof(observer));
  166. if (begin == null)
  167. throw new ArgumentNullException(nameof(begin));
  168. if (end == null)
  169. throw new ArgumentNullException(nameof(end));
  170. return FromAsyncPattern(observer, begin, iar =>
  171. {
  172. end(iar);
  173. return Unit.Default;
  174. }<#=invokeArgs#>);
  175. }
  176. <#
  177. }
  178. #>
  179. }
  180. }