import { OperatorFunction, ObservableInputTuple } from '../types'; import { raceInit } from '../observable/race'; import { operate } from '../util/lift'; import { identity } from '../util/identity'; /** * Creates an Observable that mirrors the first source Observable to emit a next, * error or complete notification from the combination of the Observable to which * the operator is applied and supplied Observables. * * ## Example * * ```ts * import { interval } from 'rxjs'; * import { mapTo, raceWith } from 'rxjs/operators'; * * const obs1 = interval(1000).pipe(mapTo('fast one')); * const obs2 = interval(3000).pipe(mapTo('medium one')); * const obs3 = interval(5000).pipe(mapTo('slow one')); * * obs2.pipe( * raceWith(obs3, obs1) * ).subscribe( * winner => console.log(winner) * ); * * // Outputs * // a series of 'fast one' * ``` * * @param otherSources Sources used to race for which Observable emits first. * @return A function that returns an Observable that mirrors the output of the * first Observable to emit an item. */ export function raceWith( ...otherSources: [...ObservableInputTuple] ): OperatorFunction { return !otherSources.length ? identity : operate((source, subscriber) => { raceInit([source, ...otherSources])(subscriber); }); }