<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".cs" #> // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System.Reactive.Disposables; namespace System.Reactive.Linq.ObservableImpl { #region [3,16]-ary /* The following code is generated by a T4 template. */ #region Zip auto-generated code (<#=DateTime.Now.ToString()#>) <# for (var i = 3; i <= 16; i++) { var ts = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j)); var os = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable source" + j)); var vs = string.Join(", ", Enumerable.Range(1, i).Select(j => "_observer" + j + ".Values.Dequeue()")); var ss = string.Join(", ", Enumerable.Range(1, i).Select(j => "_source" + j)); #> internal sealed class Zip<<#=ts#>, TResult> : Producer, TResult>._> { <# for (var j = 1; j <= i; j++) { #> private readonly IObservable> _source<#=j#>; <# } #> private readonly Func<<#=ts#>, TResult> _resultSelector; public Zip(<#=os#>, Func<<#=ts#>, TResult> resultSelector) { <# for (var j = 1; j <= i; j++) { #> _source<#=j#> = source<#=j#>; <# } #> _resultSelector = resultSelector; } protected override _ CreateSink(IObserver observer) => new _(_resultSelector, observer); protected override void Run(_ sink) => sink.Run(<#=ss#>); internal sealed class _ : ZipSink { private readonly Func<<#=ts#>, TResult> _resultSelector; <# for (var j = 1; j <= i; j++) { #> private readonly ZipObserver> _observer<#=j#>; <# } #> public _(Func<<#=ts#>, TResult> resultSelector, IObserver observer) : base(<#=i#>, observer) { _resultSelector = resultSelector; <# for (var j = 1; j <= i; j++) { #> _observer<#=j#> = new ZipObserver>(_gate, this, <#=j - 1#>); <# } #> } public void Run(<#=os#>) { var disposables = new IDisposable[<#=i#>]; <# for (var j = 1; j <= i; j++) { #> disposables[<#=j - 1#>] = _observer<#=j#>; Queues[<#= j - 1#>] = _observer<#=j#>.Values; <# } for (var j = 1; j <= i; j++) { #> _observer<#=j#>.SetResource(source<#=j#>.SubscribeSafe(_observer<#=j#>)); <# } #> SetUpstream(StableCompositeDisposable.CreateTrusted(disposables)); } protected override TResult GetResult() => _resultSelector(<#=vs#>); } } <# } #> #endregion #endregion }