<PackageReference Include="System.Reactive" Version="4.0.0" />

CombineLatest<T1, T2, T3, T4, TResult>

sealed class CombineLatest<T1, T2, T3, T4, TResult> : Producer<TResult, _<T1, T2, T3, T4, TResult>>
using System.Reactive.Disposables; namespace System.Reactive.Linq.ObservableImpl { internal sealed class CombineLatest<T1, T2, T3, T4, TResult> : Producer<TResult, CombineLatest<T1, T2, T3, T4, TResult>._> { internal sealed class _ : CombineLatestSink<TResult> { private readonly Func<T1, T2, T3, T4, TResult> _resultSelector; private CombineLatestObserver<T1> _observer1; private CombineLatestObserver<T2> _observer2; private CombineLatestObserver<T3> _observer3; private CombineLatestObserver<T4> _observer4; public _(Func<T1, T2, T3, T4, TResult> resultSelector, IObserver<TResult> observer, IDisposable cancel) : base(4, observer, cancel) { _resultSelector = resultSelector; } public IDisposable Run(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4) { SingleAssignmentDisposable[] array = new SingleAssignmentDisposable[4]; for (int i = 0; i < 4; i++) { array[i] = new SingleAssignmentDisposable(); } _observer1 = new CombineLatestObserver<T1>(_gate, this, 0, array[0]); _observer2 = new CombineLatestObserver<T2>(_gate, this, 1, array[1]); _observer3 = new CombineLatestObserver<T3>(_gate, this, 2, array[2]); _observer4 = new CombineLatestObserver<T4>(_gate, this, 3, array[3]); array[0].Disposable = ObservableExtensions.SubscribeSafe<T1>(source1, (IObserver<T1>)_observer1); array[1].Disposable = ObservableExtensions.SubscribeSafe<T2>(source2, (IObserver<T2>)_observer2); array[2].Disposable = ObservableExtensions.SubscribeSafe<T3>(source3, (IObserver<T3>)_observer3); array[3].Disposable = ObservableExtensions.SubscribeSafe<T4>(source4, (IObserver<T4>)_observer4); IDisposable[] disposables = array; return StableCompositeDisposable.Create(disposables); } protected override TResult GetResult() { return _resultSelector(_observer1.Value, _observer2.Value, _observer3.Value, _observer4.Value); } } private readonly IObservable<T1> _source1; private readonly IObservable<T2> _source2; private readonly IObservable<T3> _source3; private readonly IObservable<T4> _source4; private readonly Func<T1, T2, T3, T4, TResult> _resultSelector; public CombineLatest(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, Func<T1, T2, T3, T4, TResult> resultSelector) { _source1 = source1; _source2 = source2; _source3 = source3; _source4 = source4; _resultSelector = resultSelector; } protected override _ CreateSink(IObserver<TResult> observer, IDisposable cancel) { return new _(_resultSelector, observer, cancel); } protected override IDisposable Run(_ sink) { return sink.Run(_source1, _source2, _source3, _source4); } } }