/// <summary>
 /// Keep an <paramref name="aggregate"/> subscription latest key in all <paramref name="keySequences"/> via <paramref name="sourceFactory"/>
 /// </summary>
 /// <remarks>Will call <paramref name="sourceFactory"/> exactly when the <paramref name="aggregate"/> changes (as decided by <paramref name="keyComparer"/>) </remarks>
 /// <returns></returns>
 public static IObservable <TElement> CombineSubscriptions <TKey, TAgg, TElement>(
     this Func <TAgg, IObservable <TElement> > sourceFactory,
     IObservable <IObservable <TKey> > keySequences,
     Func <TAgg, TKey, TAgg> aggregate,
     TAgg seed = default(TAgg),
     IEqualityComparer <TAgg> keyComparer = null)
 {
     if (keyComparer == null)
     {
         keyComparer = EqualityComparer <TAgg> .Default;
     }
     return(keySequences.AggregateLatest(aggregate, seed)
            .DistinctUntilChanged(keyComparer)
            .Select(sourceFactory)
            .Switch()
            .Publish().RefCount());
 }