/// <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()); }