import { Observable as ObservableT, Subscription } from './index' import Observable from './observable' /** * Creates an observable that merges the emits of many sources * * {@link merge} takes an arbitrary amount of source `Observables` and emits any value from any of those sources in * the returned Observable<*>. The output Observable<*> will only complete() when all sources complete(). Calling unsubscribe() on the output Observable<*> will call unsubscribe() on all source Observable<*>s. * * @example Marble diagram merging two sources * * // source a: |--1-----2-----3-----4-----| * // source b: |--9-----8--------7-----6--| * // merge(a, b): |--1-9---2-8---3--7--4--6--| * * @param {Array>} sources the source observables * @returns {ObservableT} the observable that merges all the emits of all the sources */ export default function merge( a: ObservableT, b: ObservableT ): ObservableT export default function merge( a: ObservableT, b: ObservableT, c: ObservableT ): ObservableT export default function merge( a: ObservableT, b: ObservableT, c: ObservableT, d: ObservableT ): ObservableT export default function merge( ...sources: Array> ): ObservableT { return new Observable( ({ error, next, complete }): (() => void) => { let remaining = sources.length const subscriptions = sources.map( (source): Subscription => source.subscribe({ error, next, complete: (): false | void => (remaining -= 1) === 0 && complete() }) ) return (): void => { for (const { unsubscribe } of subscriptions) { unsubscribe() } } } ) }