1
0
Эх сурвалжийг харах

N-ary combining operators with tuples.

Bart De Smet 5 жил өмнө
parent
commit
c5902305c4

+ 20 - 5
Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.NAry.cs

@@ -2,14 +2,12 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information. 
 
+// This code was generated by a T4 template at 10/05/2020 14:25:54.
+
 namespace System.Reactive.Linq
 {
     partial interface IQueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest and Zip auto-generated code (10/02/2020 11:15:29)
-
         IObservable<TResult> CombineLatest<T1, T2, TResult>(IObservable<T1> source1, IObservable<T2> source2, Func<T1, T2, TResult> resultSelector);
         IObservable<TResult> CombineLatest<T1, T2, T3, TResult>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, Func<T1, T2, T3, TResult> resultSelector);
         IObservable<TResult> CombineLatest<T1, T2, T3, T4, TResult>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, Func<T1, T2, T3, T4, TResult> resultSelector);
@@ -41,7 +39,24 @@ namespace System.Reactive.Linq
         IObservable<TResult> Zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7, IObservable<T8> source8, IObservable<T9> source9, IObservable<T10> source10, IObservable<T11> source11, IObservable<T12> source12, IObservable<T13> source13, IObservable<T14> source14, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult> resultSelector);
         IObservable<TResult> Zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7, IObservable<T8> source8, IObservable<T9> source9, IObservable<T10> source10, IObservable<T11> source11, IObservable<T12> source12, IObservable<T13> source13, IObservable<T14> source14, IObservable<T15> source15, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> resultSelector);
         IObservable<TResult> Zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7, IObservable<T8> source8, IObservable<T9> source9, IObservable<T10> source10, IObservable<T11> source11, IObservable<T12> source12, IObservable<T13> source13, IObservable<T14> source14, IObservable<T15> source15, IObservable<T16> source16, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult> resultSelector);
+    }
+
+    partial interface IQueryLanguageEx
+    {
+        IObservable<(T1, T2)> CombineLatest<T1, T2>(IObservable<T1> source1, IObservable<T2> source2);
+        IObservable<(T1, T2, T3)> CombineLatest<T1, T2, T3>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3);
+        IObservable<(T1, T2, T3, T4)> CombineLatest<T1, T2, T3, T4>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4);
+        IObservable<(T1, T2, T3, T4, T5)> CombineLatest<T1, T2, T3, T4, T5>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5);
+        IObservable<(T1, T2, T3, T4, T5, T6)> CombineLatest<T1, T2, T3, T4, T5, T6>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6);
+        IObservable<(T1, T2, T3, T4, T5, T6, T7)> CombineLatest<T1, T2, T3, T4, T5, T6, T7>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7);
+        IObservable<(T1, T2, T3, T4, T5, T6, T7, T8)> CombineLatest<T1, T2, T3, T4, T5, T6, T7, T8>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7, IObservable<T8> source8);
 
-        #endregion
+        IObservable<(T1, T2)> Zip<T1, T2>(IObservable<T1> source1, IObservable<T2> source2);
+        IObservable<(T1, T2, T3)> Zip<T1, T2, T3>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3);
+        IObservable<(T1, T2, T3, T4)> Zip<T1, T2, T3, T4>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4);
+        IObservable<(T1, T2, T3, T4, T5)> Zip<T1, T2, T3, T4, T5>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5);
+        IObservable<(T1, T2, T3, T4, T5, T6)> Zip<T1, T2, T3, T4, T5, T6>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6);
+        IObservable<(T1, T2, T3, T4, T5, T6, T7)> Zip<T1, T2, T3, T4, T5, T6, T7>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7);
+        IObservable<(T1, T2, T3, T4, T5, T6, T7, T8)> Zip<T1, T2, T3, T4, T5, T6, T7, T8>(IObservable<T1> source1, IObservable<T2> source2, IObservable<T3> source3, IObservable<T4> source4, IObservable<T5> source5, IObservable<T6> source6, IObservable<T7> source7, IObservable<T8> source8);
     }
 }

+ 30 - 5
Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguage.NAry.tt

@@ -8,14 +8,12 @@
 <#@ import namespace="System.Text" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ output extension=".cs" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
 namespace System.Reactive.Linq
 {
     partial interface IQueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest and Zip auto-generated code (<#=DateTime.Now#>)
-
 <#
 for (int i = 2; i <= 16; i++)
 {
@@ -39,7 +37,34 @@ for (int i = 2; i <= 16; i++)
 <#
 }
 #>
+    }
+
+    partial interface IQueryLanguageEx
+    {
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<T" + j + "> source" + j));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j)) + ")";
+
+#>
+        IObservable<<#=tuple#>> CombineLatest<<#=genArgs#>>(<#=parameters#>);
+<#
+}
+#>
+
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j));
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<T" + j + "> source" + j));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + j)) + ")";
 
-        #endregion
+#>
+        IObservable<<#=tuple#>> Zip<<#=genArgs#>>(<#=parameters#>);
+<#
+}
+#>
     }
 }

+ 5 - 1
Rx.NET/Source/src/System.Reactive/Linq/IQueryLanguageEx.cs

@@ -10,7 +10,7 @@ namespace System.Reactive.Linq
     /// <summary>
     /// Internal interface describing the LINQ to Events query language.
     /// </summary>
-    internal interface IQueryLanguageEx
+    internal partial interface IQueryLanguageEx
     {
         IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, IEnumerable<IObservable<object>>> iteratorMethod);
         IObservable<Unit> Create(Func<IEnumerable<IObservable<object>>> iteratorMethod);
@@ -28,5 +28,9 @@ namespace System.Reactive.Linq
         IObservable<TResult> ManySelect<TSource, TResult>(IObservable<TSource> source, Func<IObservable<TSource>, TResult> selector, IScheduler scheduler);
 
         ListObservable<TSource> ToListObservable<TSource>(IObservable<TSource> source);
+
+        IObservable<(TFirst First, TSecond Second)> WithLatestFrom<TFirst, TSecond>(IObservable<TFirst> first, IObservable<TSecond> second);
+
+        IObservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(IObservable<TFirst> first, IEnumerable<TSecond> second);
     }
 }

+ 146 - 5
Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.CombineLatest.cs

@@ -2,14 +2,12 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information. 
 
+// This code was generated by a T4 template at 10/05/2020 14:25:43.
+
 namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest auto-generated code (10/02/2020 11:11:50)
-
         /// <summary>
         /// Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
         /// </summary>
@@ -1193,6 +1191,149 @@ namespace System.Reactive.Linq
             return s_impl.CombineLatest(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, source16, resultSelector);
         }
 
-        #endregion
+    }
+
+    public static partial class ObservableEx
+    {
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second)> CombineLatest<TFirst, TSecond>(this IObservable<TFirst> first, IObservable<TSecond> second)
+        {
+            return s_impl.CombineLatest(first, second);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third)> CombineLatest<TFirst, TSecond, TThird>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third)
+        {
+            return s_impl.CombineLatest(first, second, third);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)> CombineLatest<TFirst, TSecond, TThird, TFourth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth)
+        {
+            return s_impl.CombineLatest(first, second, third, fourth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth)
+        {
+            return s_impl.CombineLatest(first, second, third, fourth, fifth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth)
+        {
+            return s_impl.CombineLatest(first, second, third, fourth, fifth, sixth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh)
+        {
+            return s_impl.CombineLatest(first, second, third, fourth, fifth, sixth, seventh);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth)
+        {
+            return s_impl.CombineLatest(first, second, third, fourth, fifth, sixth, seventh, eighth);
+        }
+
     }
 }

+ 46 - 5
Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.CombineLatest.tt

@@ -8,14 +8,12 @@
 <#@ import namespace="System.Text" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ output extension=".cs" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
 namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest auto-generated code (<#=DateTime.Now#>)
-
 <#
 Func<string, string> toUpper = s => char.ToUpper(s[0]) + s.Substring(1);
 
@@ -78,6 +76,49 @@ for (int j = 0; j < i; j++)
 <#
 }
 #>
-        #endregion
+    }
+
+    public static partial class ObservableEx
+    {
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<T" + toUpper(ordinals[j - 1]) + "> " + ordinals[j - 1]));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1])));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => ordinals[j - 1]));
+    var paramRefs = string.Join(" or ", Enumerable.Range(1, i).Select(j => "<paramref name=\"" + ordinals[j - 1] + "\"/>"));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1]) + " " + toUpper(ordinals[j - 1]))) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+
+#>
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <typeparam name="T<#=toUpper(ordinals[j])#>">The type of the elements in the <#=ordinals[j]#> source sequence.</typeparam>
+<#
+}
+#>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <param name="<#=ordinals[j]#>"><#=toUpper(ordinals[j])#> observable source.</param>
+<#
+}
+#>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><#=paramRefs#> is null.</exception>
+        public static IObservable<<#=tuple#>> CombineLatest<<#=genArgs#>>(this <#=parameters#>)
+        {
+            return s_impl.CombineLatest(<#=sources#>);
+        }
+
+<#
+}
+#>
     }
 }

+ 146 - 5
Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.Zip.cs

@@ -2,14 +2,12 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information. 
 
+// This code was generated by a T4 template at 10/05/2020 14:25:34.
+
 namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        /* The following code is generated by a T4 template. */
-
-        #region Zip auto-generated code (10/02/2020 11:11:42)
-
         /// <summary>
         /// Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
         /// </summary>
@@ -1179,6 +1177,149 @@ namespace System.Reactive.Linq
             return s_impl.Zip(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, source16, resultSelector);
         }
 
-        #endregion
+    }
+
+    public static partial class ObservableEx
+    {
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(this IObservable<TFirst> first, IObservable<TSecond> second)
+        {
+            return s_impl.Zip(first, second);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third)> Zip<TFirst, TSecond, TThird>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third)
+        {
+            return s_impl.Zip(first, second, third);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)> Zip<TFirst, TSecond, TThird, TFourth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth)
+        {
+            return s_impl.Zip(first, second, third, fourth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth)
+        {
+            return s_impl.Zip(first, second, third, fourth, fifth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth)
+        {
+            return s_impl.Zip(first, second, third, fourth, fifth, sixth);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh)
+        {
+            return s_impl.Zip(first, second, third, fourth, fifth, sixth, seventh);
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(this IObservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth)
+        {
+            return s_impl.Zip(first, second, third, fourth, fifth, sixth, seventh, eighth);
+        }
+
     }
 }

+ 46 - 5
Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.Zip.tt

@@ -8,14 +8,12 @@
 <#@ import namespace="System.Text" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ output extension=".cs" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
 namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        /* The following code is generated by a T4 template. */
-
-        #region Zip auto-generated code (<#=DateTime.Now#>)
-
 <#
 Func<string, string> toUpper = s => char.ToUpper(s[0]) + s.Substring(1);
 
@@ -77,6 +75,49 @@ for (int j = 0; j < i; j++)
 <#
 }
 #>
-        #endregion
+    }
+
+    public static partial class ObservableEx
+    {
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<T" + toUpper(ordinals[j - 1]) + "> " + ordinals[j - 1]));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1])));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => ordinals[j - 1]));
+    var paramRefs = string.Join(" or ", Enumerable.Range(1, i).Select(j => "<paramref name=\"" + ordinals[j - 1] + "\"/>"));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1]) + " " + toUpper(ordinals[j - 1]))) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+
+#>
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <typeparam name="T<#=toUpper(ordinals[j])#>">The type of the elements in the <#=ordinals[j]#> source sequence.</typeparam>
+<#
+}
+#>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <param name="<#=ordinals[j]#>"><#=toUpper(ordinals[j])#> observable source.</param>
+<#
+}
+#>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><#=paramRefs#> is null.</exception>
+        public static IObservable<<#=tuple#>> Zip<<#=genArgs#>>(this <#=parameters#>)
+        {
+            return s_impl.Zip(<#=sources#>);
+        }
+
+<#
+}
+#>
     }
 }

+ 52 - 0
Rx.NET/Source/src/System.Reactive/Linq/Observable.Multiple.cs

@@ -3,6 +3,7 @@
 // See the LICENSE file in the project root for more information. 
 
 using System.Collections.Generic;
+using System.Configuration;
 using System.Reactive.Concurrency;
 using System.Threading;
 using System.Threading.Tasks;
@@ -1126,4 +1127,55 @@ namespace System.Reactive.Linq
 
         #endregion
     }
+
+    public static partial class ObservableEx
+    {
+        /// <summary>
+        /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, as a tuple value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second)> WithLatestFrom<TFirst, TSecond>(this IObservable<TFirst> first, IObservable<TSecond> second)
+        {
+            if (first == null)
+            {
+                throw new ArgumentNullException(nameof(first));
+            }
+
+            if (second == null)
+            {
+                throw new ArgumentNullException(nameof(second));
+            }
+
+            return s_impl.WithLatestFrom(first, second);
+        }
+
+        /// <summary>
+        /// Merges an observable sequence and an enumerable sequence into one observable sequence of tuple values.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first observable source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second enumerable source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second enumerable source.</param>
+        /// <returns>An observable sequence containing the result of pairwise combining the elements of the first and second source as a tuple value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IObservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(this IObservable<TFirst> first, IEnumerable<TSecond> second)
+        {
+            if (first == null)
+            {
+                throw new ArgumentNullException(nameof(first));
+            }
+
+            if (second == null)
+            {
+                throw new ArgumentNullException(nameof(second));
+            }
+
+            return s_impl.Zip(first, second);
+        }
+    }
 }

+ 1 - 1
Rx.NET/Source/src/System.Reactive/Linq/ObservableEx.cs

@@ -10,7 +10,7 @@ namespace System.Reactive.Linq
     /// <summary>
     /// Provides a set of static methods for writing in-memory queries over observable sequences.
     /// </summary>
-    public static class ObservableEx
+    public static partial class ObservableEx
     {
 #pragma warning disable IDE1006 // Naming Styles: 3rd party code is known to reflect for this specific field name
         private static IQueryLanguageEx s_impl = QueryServices.GetQueryImpl<IQueryLanguageEx>(new QueryLanguageEx());

+ 60 - 0
Rx.NET/Source/src/System.Reactive/Linq/QbservableEx.Generated.cs

@@ -348,6 +348,66 @@ namespace System.Reactive.Linq
         }
 #endif
 
+        /// <summary>
+        /// Merges two observable sequences into one observable sequence by combining each element from the first source with the latest element from the second source, if any.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining each element of the first source with the latest element from the second source, if any, as a tuple value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second)> WithLatestFrom<TFirst, TSecond>(this IQbservable<TFirst> first, IObservable<TSecond> second)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => QbservableEx.WithLatestFrom<TFirst, TSecond>(default(IQbservable<TFirst>), default(IObservable<TSecond>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TFirst), typeof(TSecond)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges an observable sequence and an enumerable sequence into one observable sequence of tuple values.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first observable source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second enumerable source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second enumerable source.</param>
+        /// <returns>An observable sequence containing the result of pairwise combining the elements of the first and second source as a tuple value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(this IQbservable<TFirst> first, IEnumerable<TSecond> second)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => QbservableEx.Zip<TFirst, TSecond>(default(IQbservable<TFirst>), default(IEnumerable<TSecond>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TFirst), typeof(TSecond)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second)
+                )
+            );
+        }
+
     }
 }
 

+ 1967 - 0
Rx.NET/Source/src/System.Reactive/Linq/QbservableEx.NAry.cs

@@ -0,0 +1,1967 @@
+// 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. 
+
+// This code was generated by a T4 template at 10/05/2020 14:10:15.
+
+using System.Linq.Expressions;
+#if !CRIPPLED_REFLECTION
+using System.Reflection;
+#endif
+
+namespace System.Reactive.Linq
+{
+    public static partial class QbservableEx
+    {
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second)> CombineLatest<TFirst, TSecond>(this IQbservable<TFirst> first, IObservable<TSecond> second)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third)> CombineLatest<TFirst, TSecond, TThird>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)> CombineLatest<TFirst, TSecond, TThird, TFourth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <typeparam name="TFifteenth">The type of the elements in the fifteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <param name="fifteenth">Fifteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> or <paramref name="fifteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth, IObservable<TFifteenth> fifteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+            if (fifteenth == null)
+                throw new ArgumentNullException(nameof(fifteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth), typeof(TFifteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth),
+                    GetSourceExpression(fifteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <typeparam name="TFifteenth">The type of the elements in the fifteenth source sequence.</typeparam>
+        /// <typeparam name="TSixteenth">The type of the elements in the sixteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <param name="fifteenth">Fifteenth observable source.</param>
+        /// <param name="sixteenth">Sixteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> or <paramref name="fifteenth"/> or <paramref name="sixteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth, TSixteenth Sixteenth)> CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth, TSixteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth, IObservable<TFifteenth> fifteenth, IObservable<TSixteenth> sixteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+            if (fifteenth == null)
+                throw new ArgumentNullException(nameof(fifteenth));
+            if (sixteenth == null)
+                throw new ArgumentNullException(nameof(sixteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth, TSixteenth Sixteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth, TSixteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth), typeof(TFifteenth), typeof(TSixteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth),
+                    GetSourceExpression(fifteenth),
+                    GetSourceExpression(sixteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(this IQbservable<TFirst> first, IObservable<TSecond> second)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third)> Zip<TFirst, TSecond, TThird>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)> Zip<TFirst, TSecond, TThird, TFourth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <typeparam name="TFifteenth">The type of the elements in the fifteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <param name="fifteenth">Fifteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> or <paramref name="fifteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth, IObservable<TFifteenth> fifteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+            if (fifteenth == null)
+                throw new ArgumentNullException(nameof(fifteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth), typeof(TFifteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth),
+                    GetSourceExpression(fifteenth)
+                )
+            );
+        }
+
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+        /// <typeparam name="TFirst">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSecond">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TThird">The type of the elements in the third source sequence.</typeparam>
+        /// <typeparam name="TFourth">The type of the elements in the fourth source sequence.</typeparam>
+        /// <typeparam name="TFifth">The type of the elements in the fifth source sequence.</typeparam>
+        /// <typeparam name="TSixth">The type of the elements in the sixth source sequence.</typeparam>
+        /// <typeparam name="TSeventh">The type of the elements in the seventh source sequence.</typeparam>
+        /// <typeparam name="TEighth">The type of the elements in the eighth source sequence.</typeparam>
+        /// <typeparam name="TNinth">The type of the elements in the ninth source sequence.</typeparam>
+        /// <typeparam name="TTenth">The type of the elements in the tenth source sequence.</typeparam>
+        /// <typeparam name="TEleventh">The type of the elements in the eleventh source sequence.</typeparam>
+        /// <typeparam name="TTwelfth">The type of the elements in the twelfth source sequence.</typeparam>
+        /// <typeparam name="TThirteenth">The type of the elements in the thirteenth source sequence.</typeparam>
+        /// <typeparam name="TFourteenth">The type of the elements in the fourteenth source sequence.</typeparam>
+        /// <typeparam name="TFifteenth">The type of the elements in the fifteenth source sequence.</typeparam>
+        /// <typeparam name="TSixteenth">The type of the elements in the sixteenth source sequence.</typeparam>
+        /// <param name="first">First observable source.</param>
+        /// <param name="second">Second observable source.</param>
+        /// <param name="third">Third observable source.</param>
+        /// <param name="fourth">Fourth observable source.</param>
+        /// <param name="fifth">Fifth observable source.</param>
+        /// <param name="sixth">Sixth observable source.</param>
+        /// <param name="seventh">Seventh observable source.</param>
+        /// <param name="eighth">Eighth observable source.</param>
+        /// <param name="ninth">Ninth observable source.</param>
+        /// <param name="tenth">Tenth observable source.</param>
+        /// <param name="eleventh">Eleventh observable source.</param>
+        /// <param name="twelfth">Twelfth observable source.</param>
+        /// <param name="thirteenth">Thirteenth observable source.</param>
+        /// <param name="fourteenth">Fourteenth observable source.</param>
+        /// <param name="fifteenth">Fifteenth observable source.</param>
+        /// <param name="sixteenth">Sixteenth observable source.</param>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="first"/> or <paramref name="second"/> or <paramref name="third"/> or <paramref name="fourth"/> or <paramref name="fifth"/> or <paramref name="sixth"/> or <paramref name="seventh"/> or <paramref name="eighth"/> or <paramref name="ninth"/> or <paramref name="tenth"/> or <paramref name="eleventh"/> or <paramref name="twelfth"/> or <paramref name="thirteenth"/> or <paramref name="fourteenth"/> or <paramref name="fifteenth"/> or <paramref name="sixteenth"/> is null.</exception>
+        public static IQbservable<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth, TSixteenth Sixteenth)> Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth, TSixteenth>(this IQbservable<TFirst> first, IObservable<TSecond> second, IObservable<TThird> third, IObservable<TFourth> fourth, IObservable<TFifth> fifth, IObservable<TSixth> sixth, IObservable<TSeventh> seventh, IObservable<TEighth> eighth, IObservable<TNinth> ninth, IObservable<TTenth> tenth, IObservable<TEleventh> eleventh, IObservable<TTwelfth> twelfth, IObservable<TThirteenth> thirteenth, IObservable<TFourteenth> fourteenth, IObservable<TFifteenth> fifteenth, IObservable<TSixteenth> sixteenth)
+        {
+            if (first == null)
+                throw new ArgumentNullException(nameof(first));
+            if (second == null)
+                throw new ArgumentNullException(nameof(second));
+            if (third == null)
+                throw new ArgumentNullException(nameof(third));
+            if (fourth == null)
+                throw new ArgumentNullException(nameof(fourth));
+            if (fifth == null)
+                throw new ArgumentNullException(nameof(fifth));
+            if (sixth == null)
+                throw new ArgumentNullException(nameof(sixth));
+            if (seventh == null)
+                throw new ArgumentNullException(nameof(seventh));
+            if (eighth == null)
+                throw new ArgumentNullException(nameof(eighth));
+            if (ninth == null)
+                throw new ArgumentNullException(nameof(ninth));
+            if (tenth == null)
+                throw new ArgumentNullException(nameof(tenth));
+            if (eleventh == null)
+                throw new ArgumentNullException(nameof(eleventh));
+            if (twelfth == null)
+                throw new ArgumentNullException(nameof(twelfth));
+            if (thirteenth == null)
+                throw new ArgumentNullException(nameof(thirteenth));
+            if (fourteenth == null)
+                throw new ArgumentNullException(nameof(fourteenth));
+            if (fifteenth == null)
+                throw new ArgumentNullException(nameof(fifteenth));
+            if (sixteenth == null)
+                throw new ArgumentNullException(nameof(sixteenth));
+
+            return first.Provider.CreateQuery<(TFirst First, TSecond Second, TThird Third, TFourth Fourth, TFifth Fifth, TSixth Sixth, TSeventh Seventh, TEighth Eighth, TNinth Ninth, TTenth Tenth, TEleventh Eleventh, TTwelfth Twelfth, TThirteenth Thirteenth, TFourteenth Fourteenth, TFifteenth Fifteenth, TSixteenth Sixteenth)>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<TFirst, TSecond, TThird, TFourth, TFifth, TSixth, TSeventh, TEighth, TNinth, TTenth, TEleventh, TTwelfth, TThirteenth, TFourteenth, TFifteenth, TSixteenth>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(typeof(TFirst), typeof(TSecond), typeof(TThird), typeof(TFourth), typeof(TFifth), typeof(TSixth), typeof(TSeventh), typeof(TEighth), typeof(TNinth), typeof(TTenth), typeof(TEleventh), typeof(TTwelfth), typeof(TThirteenth), typeof(TFourteenth), typeof(TFifteenth), typeof(TSixteenth)),
+#endif
+                    first.Expression,
+                    GetSourceExpression(second),
+                    GetSourceExpression(third),
+                    GetSourceExpression(fourth),
+                    GetSourceExpression(fifth),
+                    GetSourceExpression(sixth),
+                    GetSourceExpression(seventh),
+                    GetSourceExpression(eighth),
+                    GetSourceExpression(ninth),
+                    GetSourceExpression(tenth),
+                    GetSourceExpression(eleventh),
+                    GetSourceExpression(twelfth),
+                    GetSourceExpression(thirteenth),
+                    GetSourceExpression(fourteenth),
+                    GetSourceExpression(fifteenth),
+                    GetSourceExpression(sixteenth)
+                )
+            );
+        }
+
+    }
+}

+ 164 - 0
Rx.NET/Source/src/System.Reactive/Linq/QbservableEx.NAry.tt

@@ -0,0 +1,164 @@
+// 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. 
+
+<#@ 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" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
+using System.Linq.Expressions;
+#if !CRIPPLED_REFLECTION
+using System.Reflection;
+#endif
+
+namespace System.Reactive.Linq
+{
+    public static partial class QbservableEx
+    {
+<#
+Func<string, string> toUpper = s => char.ToUpper(s[0]) + s.Substring(1);
+
+string[] ordinals = new[] { "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth" };
+
+for (int i = 2; i <= 16; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "I" + (j == 1 ? "Q" : "O") + "bservable<T" + toUpper(ordinals[j - 1]) + "> " + ordinals[j - 1]));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1])));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => ordinals[j - 1]));
+    var paramRefs = string.Join(" or ", Enumerable.Range(1, i).Select(j => "<paramref name=\"" + ordinals[j - 1] + "\"/>"));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1]) + " " + toUpper(ordinals[j - 1]))) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+    var typeofGenArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "typeof(T" + toUpper(ordinals[j - 1]) + ")"));
+
+#>
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever any of the observable sequences produces an element.
+        /// </summary>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <typeparam name="T<#=toUpper(ordinals[j])#>">The type of the elements in the <#=ordinals[j]#> source sequence.</typeparam>
+<#
+}
+#>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <param name="<#=ordinals[j]#>"><#=toUpper(ordinals[j])#> observable source.</param>
+<#
+}
+#>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><#=paramRefs#> is null.</exception>
+        public static IQbservable<<#=tuple#>> CombineLatest<<#=genArgs#>>(this <#=parameters#>)
+        {
+<#
+for (int j = 1; j <= i; j++)
+{
+#>
+            if (<#=ordinals[j - 1]#> == null)
+                throw new ArgumentNullException(nameof(<#=ordinals[j - 1]#>));
+<#
+}
+#>
+
+            return first.Provider.CreateQuery<<#=tuple#>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.CombineLatest<<#=genArgs#>>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(<#=typeofGenArgs#>),
+#endif
+                    first.Expression,
+<#
+for (int j = 2; j <= i; j++)
+{
+#>
+                    GetSourceExpression(<#=ordinals[j - 1]#>)<#=j != i ? "," : ""#>
+<#
+}
+#>
+                )
+            );
+        }
+
+<#
+}
+
+for (int i = 2; i <= 16; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "I" + (j == 1 ? "Q" : "O") + "bservable<T" + toUpper(ordinals[j - 1]) + "> " + ordinals[j - 1]));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1])));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => ordinals[j - 1]));
+    var paramRefs = string.Join(" or ", Enumerable.Range(1, i).Select(j => "<paramref name=\"" + ordinals[j - 1] + "\"/>"));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "T" + toUpper(ordinals[j - 1]) + " " + toUpper(ordinals[j - 1]))) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+    var typeofGenArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "typeof(T" + toUpper(ordinals[j - 1]) + ")"));
+
+#>
+        /// <summary>
+        /// Merges the specified observable sequences into one observable sequence of tuple values whenever all of the observable sequences have produced an element at a corresponding index.
+        /// </summary>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <typeparam name="T<#=toUpper(ordinals[j])#>">The type of the elements in the <#=ordinals[j]#> source sequence.</typeparam>
+<#
+}
+#>
+<#
+for (int j = 0; j < i; j++)
+{
+#>
+        /// <param name="<#=ordinals[j]#>"><#=toUpper(ordinals[j])#> observable source.</param>
+<#
+}
+#>
+        /// <returns>An observable sequence containing the result of combining elements of the sources using tuple values.</returns>
+        /// <exception cref="ArgumentNullException"><#=paramRefs#> is null.</exception>
+        public static IQbservable<<#=tuple#>> Zip<<#=genArgs#>>(this <#=parameters#>)
+        {
+<#
+for (int j = 1; j <= i; j++)
+{
+#>
+            if (<#=ordinals[j - 1]#> == null)
+                throw new ArgumentNullException(nameof(<#=ordinals[j - 1]#>));
+<#
+}
+#>
+
+            return first.Provider.CreateQuery<<#=tuple#>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.Zip<<#=genArgs#>>(default(IQbservable<TSource1>), default(IObservable<TSource2>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()!).MakeGenericMethod(<#=typeofGenArgs#>),
+#endif
+                    first.Expression,
+<#
+for (int j = 2; j <= i; j++)
+{
+#>
+                    GetSourceExpression(<#=ordinals[j - 1]#>)<#=j != i ? "," : ""#>
+<#
+}
+#>
+                )
+            );
+        }
+
+<#
+}
+#>
+    }
+}

+ 41 - 5
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.CombineLatest.cs

@@ -2,16 +2,14 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information.
 
+// This code was generated by a T4 template at 10/05/2020 14:25:15.
+
 namespace System.Reactive.Linq
 {
     using ObservableImpl;
 
     internal partial class QueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest auto-generated code (10/02/2020 11:12:00)
-
         public virtual IObservable<TResult> CombineLatest<TSource1, TSource2, TSource3, TResult>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, Func<TSource1, TSource2, TSource3, TResult> resultSelector)
         {
             return new CombineLatest<TSource1, TSource2, TSource3, TResult>(source1, source2, source3, resultSelector);
@@ -82,6 +80,44 @@ namespace System.Reactive.Linq
             return new CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8, TSource9, TSource10, TSource11, TSource12, TSource13, TSource14, TSource15, TSource16, TResult>(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, source16, resultSelector);
         }
 
-        #endregion
+    }
+
+    internal partial class QueryLanguageEx
+    {
+        public virtual IObservable<(TSource1, TSource2)> CombineLatest<TSource1, TSource2>(IObservable<TSource1> source1, IObservable<TSource2> source2)
+        {
+            return new CombineLatest<TSource1, TSource2, (TSource1, TSource2)>(source1, source2, (t1, t2) => (t1, t2));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3)> CombineLatest<TSource1, TSource2, TSource3>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, (TSource1, TSource2, TSource3)>(source1, source2, source3, (t1, t2, t3) => (t1, t2, t3));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4)> CombineLatest<TSource1, TSource2, TSource3, TSource4>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, TSource4, (TSource1, TSource2, TSource3, TSource4)>(source1, source2, source3, source4, (t1, t2, t3, t4) => (t1, t2, t3, t4));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5)> CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, (TSource1, TSource2, TSource3, TSource4, TSource5)>(source1, source2, source3, source4, source5, (t1, t2, t3, t4, t5) => (t1, t2, t3, t4, t5));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6)> CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6)>(source1, source2, source3, source4, source5, source6, (t1, t2, t3, t4, t5, t6) => (t1, t2, t3, t4, t5, t6));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7)> CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6, IObservable<TSource7> source7)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7)>(source1, source2, source3, source4, source5, source6, source7, (t1, t2, t3, t4, t5, t6, t7) => (t1, t2, t3, t4, t5, t6, t7));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8)> CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6, IObservable<TSource7> source7, IObservable<TSource8> source8)
+        {
+            return new CombineLatest<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8)>(source1, source2, source3, source4, source5, source6, source7, source8, (t1, t2, t3, t4, t5, t6, t7, t8) => (t1, t2, t3, t4, t5, t6, t7, t8));
+        }
+
     }
 }

+ 25 - 5
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.CombineLatest.tt

@@ -8,16 +8,14 @@
 <#@ import namespace="System.Text" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ output extension=".cs" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
 namespace System.Reactive.Linq
 {
     using ObservableImpl;
 
     internal partial class QueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region CombineLatest auto-generated code (<#=DateTime.Now#>)
-
 <#
 for (int i = 3; i <= 16; i++)
 {
@@ -34,6 +32,28 @@ for (int i = 3; i <= 16; i++)
 <#
 }
 #>
-        #endregion
+    }
+
+    internal partial class QueryLanguageEx
+    {
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<TSource" + j + "> source" + j));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "TSource" + j));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => "source" + j));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "TSource" + j)) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+    var selector = "(" + vals + ") => (" + vals + ")";
+
+#>
+        public virtual IObservable<<#=tuple#>> CombineLatest<<#=genArgs#>>(<#=parameters#>)
+        {
+            return new CombineLatest<<#=genArgs#>, <#=tuple#>>(<#=sources#>, <#=selector#>);
+        }
+
+<#
+}
+#>
     }
 }

+ 42 - 5
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.Zip.cs

@@ -2,16 +2,14 @@
 // The .NET Foundation licenses this file to you under the MIT License.
 // See the LICENSE file in the project root for more information.
 
+// This code was generated by a T4 template at 10/05/2020 14:25:21.
+
 namespace System.Reactive.Linq
 {
     using ObservableImpl;
 
     internal partial class QueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region Zip auto-generated code (10/02/2020 11:12:08)
-
         public virtual IObservable<TResult> Zip<TSource1, TSource2, TSource3, TResult>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, Func<TSource1, TSource2, TSource3, TResult> resultSelector)
         {
             return new Zip<TSource1, TSource2, TSource3, TResult>(source1, source2, source3, resultSelector);
@@ -82,6 +80,45 @@ namespace System.Reactive.Linq
             return new Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8, TSource9, TSource10, TSource11, TSource12, TSource13, TSource14, TSource15, TSource16, TResult>(source1, source2, source3, source4, source5, source6, source7, source8, source9, source10, source11, source12, source13, source14, source15, source16, resultSelector);
         }
 
-        #endregion
+    }
+
+
+    internal partial class QueryLanguageEx
+    {
+        public virtual IObservable<(TSource1, TSource2)> Zip<TSource1, TSource2>(IObservable<TSource1> source1, IObservable<TSource2> source2)
+        {
+            return new Zip<TSource1, TSource2, (TSource1, TSource2)>.Observable(source1, source2, (t1, t2) => (t1, t2));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3)> Zip<TSource1, TSource2, TSource3>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3)
+        {
+            return new Zip<TSource1, TSource2, TSource3, (TSource1, TSource2, TSource3)>(source1, source2, source3, (t1, t2, t3) => (t1, t2, t3));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4)> Zip<TSource1, TSource2, TSource3, TSource4>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4)
+        {
+            return new Zip<TSource1, TSource2, TSource3, TSource4, (TSource1, TSource2, TSource3, TSource4)>(source1, source2, source3, source4, (t1, t2, t3, t4) => (t1, t2, t3, t4));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5)> Zip<TSource1, TSource2, TSource3, TSource4, TSource5>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5)
+        {
+            return new Zip<TSource1, TSource2, TSource3, TSource4, TSource5, (TSource1, TSource2, TSource3, TSource4, TSource5)>(source1, source2, source3, source4, source5, (t1, t2, t3, t4, t5) => (t1, t2, t3, t4, t5));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6)> Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6)
+        {
+            return new Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6)>(source1, source2, source3, source4, source5, source6, (t1, t2, t3, t4, t5, t6) => (t1, t2, t3, t4, t5, t6));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7)> Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6, IObservable<TSource7> source7)
+        {
+            return new Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7)>(source1, source2, source3, source4, source5, source6, source7, (t1, t2, t3, t4, t5, t6, t7) => (t1, t2, t3, t4, t5, t6, t7));
+        }
+
+        public virtual IObservable<(TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8)> Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8>(IObservable<TSource1> source1, IObservable<TSource2> source2, IObservable<TSource3> source3, IObservable<TSource4> source4, IObservable<TSource5> source5, IObservable<TSource6> source6, IObservable<TSource7> source7, IObservable<TSource8> source8)
+        {
+            return new Zip<TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8, (TSource1, TSource2, TSource3, TSource4, TSource5, TSource6, TSource7, TSource8)>(source1, source2, source3, source4, source5, source6, source7, source8, (t1, t2, t3, t4, t5, t6, t7, t8) => (t1, t2, t3, t4, t5, t6, t7, t8));
+        }
+
     }
 }

+ 27 - 5
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Multiple.Zip.tt

@@ -8,16 +8,14 @@
 <#@ import namespace="System.Text" #>
 <#@ import namespace="System.Collections.Generic" #>
 <#@ output extension=".cs" #>
+// This code was generated by a T4 template at <#=DateTime.Now#>.
+
 namespace System.Reactive.Linq
 {
     using ObservableImpl;
 
     internal partial class QueryLanguage
     {
-        /* The following code is generated by a T4 template. */
-
-        #region Zip auto-generated code (<#=DateTime.Now#>)
-
 <#
 for (int i = 3; i <= 16; i++)
 {
@@ -34,6 +32,30 @@ for (int i = 3; i <= 16; i++)
 <#
 }
 #>
-        #endregion
+    }
+
+
+    internal partial class QueryLanguageEx
+    {
+<#
+for (int i = 2; i <= 8; i++)
+{
+    var parameters = string.Join(", ", Enumerable.Range(1, i).Select(j => "IObservable<TSource" + j + "> source" + j));
+    var genArgs = string.Join(", ", Enumerable.Range(1, i).Select(j => "TSource" + j));
+    var sources = string.Join(", ", Enumerable.Range(1, i).Select(j => "source" + j));
+    var tuple = "(" + string.Join(", ", Enumerable.Range(1, i).Select(j => "TSource" + j)) + ")";
+    var vals = string.Join(", ", Enumerable.Range(1, i).Select(j => "t" + j));
+    var selector = "(" + vals + ") => (" + vals + ")";
+    var extra = i == 2 ? ".Observable" : "";
+
+#>
+        public virtual IObservable<<#=tuple#>> Zip<<#=genArgs#>>(<#=parameters#>)
+        {
+            return new Zip<<#=genArgs#>, <#=tuple#>><#=extra#>(<#=sources#>, <#=selector#>);
+        }
+
+<#
+}
+#>
     }
 }

+ 21 - 1
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguageEx.cs

@@ -10,7 +10,9 @@ using System.Reactive.Subjects;
 
 namespace System.Reactive.Linq
 {
-    internal class QueryLanguageEx : IQueryLanguageEx
+    using ObservableImpl;
+
+    internal partial class QueryLanguageEx : IQueryLanguageEx
     {
         #region Create
 
@@ -531,6 +533,24 @@ namespace System.Reactive.Linq
 
         #endregion
 
+        #region WithLatestFrom
+
+        public virtual IObservable<(TFirst First, TSecond Second)> WithLatestFrom<TFirst, TSecond>(IObservable<TFirst> first, IObservable<TSecond> second)
+        {
+            return new WithLatestFrom<TFirst, TSecond, (TFirst, TSecond)>(first, second, (t1, t2) => (t1, t2));
+        }
+
+        #endregion
+
+        #region Zip
+
+        public virtual IObservable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(IObservable<TFirst> first, IEnumerable<TSecond> second)
+        {
+            return new Zip<TFirst, TSecond, (TFirst, TSecond)>.Enumerable(first, second, (t1, t2) => (t1, t2));
+        }
+
+        #endregion
+
         #region |> Helpers <|
 
         private static IObservable<TResult> Combine<TLeft, TRight, TResult>(IObservable<TLeft> leftSource, IObservable<TRight> rightSource, Func<IObserver<TResult>, IDisposable, IDisposable, IObserver<Either<Notification<TLeft>, Notification<TRight>>>> combinerSelector)

+ 14 - 0
Rx.NET/Source/src/System.Reactive/System.Reactive.csproj

@@ -27,6 +27,10 @@
     <!-- Workaround so the files appear in VS -->
     <None Include="Platforms\**\*.*" />
     <Compile Include="..\AssemblyInfo.cs" Link="Properties\AssemblyInfo.cs" />
+    <None Update="Linq\QbservableEx.NAry.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>QbservableEx.NAry.cs</LastGenOutput>
+    </None>
     <None Update="Platforms\Windows\Strings_WindowsThreading.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Strings_WindowsThreading.resx" />
     <None Update="Platforms\Windows\Strings_WindowsThreading.resx" CustomToolNamespace="System.Reactive" Generator="ResXFileCodeGenerator" LastGenOutput="Strings_WindowsThreading.Designer.cs" />
   </ItemGroup>
@@ -101,6 +105,11 @@
       <AutoGen>True</AutoGen>
       <DependentUpon>Observable.Multiple.Zip.tt</DependentUpon>
     </Compile>
+    <Compile Update="Linq\QbservableEx.NAry.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>QbservableEx.NAry.tt</DependentUpon>
+    </Compile>
     <Compile Update="Linq\QueryLanguage.Multiple.CombineLatest.cs">
       <DesignTime>True</DesignTime>
       <AutoGen>True</AutoGen>
@@ -179,6 +188,11 @@
     <None Include="build\_._" PackagePath="buildTransitive\net5.0" Pack="true" />
     <None Include="build\System.Reactive.targets" PackagePath="buildTransitive\netcoreapp3.1" Pack="true" />
     <None Include="build\System.Reactive.targets" PackagePath="build\netcoreapp3.1" Pack="true" />
+    <None Include="Linq\QbservableEx.NAry.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>QbservableEx.NAry.tt</DependentUpon>
+    </None>
   </ItemGroup>
 
   <ItemGroup>