CombineLatest.Generated.tt 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <#@ template debug="false" hostspecific="false" language="C#" #>
  2. <#@ assembly name="System.Core" #>
  3. <#@ import namespace="System.Linq" #>
  4. <#@ import namespace="System.Text" #>
  5. <#@ import namespace="System.Collections.Generic" #>
  6. <#@ output extension=".cs" #>
  7. // Licensed to the .NET Foundation under one or more agreements.
  8. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  9. // See the LICENSE file in the project root for more information.
  10. using System.Reactive.Disposables;
  11. namespace System.Reactive.Linq.ObservableImpl
  12. {
  13. #region [3,16]-ary
  14. /* The following code is generated by a T4 template. */
  15. #region CombineLatest auto-generated code (<#=DateTime.Now.ToString()#>)
  16. <#
  17. for (var i = 3; i <= 16; i++)
  18. {
  19. var ts = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
  20. var os = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<T" + j + "> source" + j));
  21. var vs = string.Join(", ", Enumerable.Range(1, i).Select(j => "_observer" + j + ".Value"));
  22. var ss = string.Join(", ", Enumerable.Range(1, i).Select(j => "_source" + j));
  23. #>
  24. internal sealed class CombineLatest<<#=ts#>, TResult> : Producer<TResult, CombineLatest<<#=ts#>, TResult>._>
  25. {
  26. <#
  27. for (var j = 1; j <= i; j++)
  28. {
  29. #>
  30. private readonly IObservable<T<#=j#>> _source<#=j#>;
  31. <#
  32. }
  33. #>
  34. private readonly Func<<#=ts#>, TResult> _resultSelector;
  35. public CombineLatest(<#=os#>, Func<<#=ts#>, TResult> resultSelector)
  36. {
  37. <#
  38. for (var j = 1; j <= i; j++)
  39. {
  40. #>
  41. _source<#=j#> = source<#=j#>;
  42. <#
  43. }
  44. #>
  45. _resultSelector = resultSelector;
  46. }
  47. protected override _ CreateSink(IObserver<TResult> observer) => new _(_resultSelector, observer);
  48. protected override void Run(_ sink) => sink.Run(<#=ss#>);
  49. internal sealed class _ : CombineLatestSink<TResult>
  50. {
  51. private readonly Func<<#=ts#>, TResult> _resultSelector;
  52. public _(Func<<#=ts#>, TResult> resultSelector, IObserver<TResult> observer)
  53. : base(<#=i#>, observer)
  54. {
  55. _resultSelector = resultSelector;
  56. }
  57. <#
  58. for (var j = 1; j <= i; j++)
  59. {
  60. #>
  61. private CombineLatestObserver<T<#=j#>> _observer<#=j#>;
  62. <#
  63. }
  64. #>
  65. public void Run(<#=os#>)
  66. {
  67. var subscriptions = new IDisposable[<#=i#>];
  68. <#
  69. for (var j = 1; j <= i; j++)
  70. {
  71. #>
  72. subscriptions[<#=j - 1#>] = _observer<#=j#> = new CombineLatestObserver<T<#=j#>>(_gate, this, <#=j - 1#>);
  73. <#
  74. }
  75. #>
  76. <#
  77. for (var j = 1; j <= i; j++)
  78. {
  79. #>
  80. _observer<#=j#>.SetResource(source<#=j#>.SubscribeSafe(_observer<#=j#>));
  81. <#
  82. }
  83. #>
  84. SetUpstream(StableCompositeDisposable.CreateTrusted(subscriptions));
  85. }
  86. protected override TResult GetResult() => _resultSelector(<#=vs#>);
  87. }
  88. }
  89. <#
  90. }
  91. #>
  92. #endregion
  93. #endregion
  94. }