+++ /dev/null
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { fromArray } from './fromArray';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { TeardownLogic, ObservableInput } from '../types';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-// tslint:disable:max-line-length
-export function race<A>(arg: [ObservableInput<A>]): Observable<A>;
-export function race<A, B>(arg: [ObservableInput<A>, ObservableInput<B>]): Observable<A | B>;
-export function race<A, B, C>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<A | B | C>;
-export function race<A, B, C, D>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<A | B | C | D>;
-export function race<A, B, C, D, E>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>]): Observable<A | B | C | D | E>;
-export function race<T>(arg: ObservableInput<T>[]): Observable<T>;
-export function race(arg: ObservableInput<any>[]): Observable<{}>;
-
-export function race<A>(a: ObservableInput<A>): Observable<A>;
-export function race<A, B>(a: ObservableInput<A>, b: ObservableInput<B>): Observable<A | B>;
-export function race<A, B, C>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>): Observable<A | B | C>;
-export function race<A, B, C, D>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>): Observable<A | B | C | D>;
-export function race<A, B, C, D, E>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>, e: ObservableInput<E>): Observable<A | B | C | D | E>;
-// tslint:enable:max-line-length
-
-export function race<T>(observables: ObservableInput<T>[]): Observable<T>;
-export function race(observables: ObservableInput<any>[]): Observable<{}>;
-export function race<T>(...observables: ObservableInput<T>[]): Observable<T>;
-export function race(...observables: ObservableInput<any>[]): Observable<{}>;
-
-/**
- * Returns an Observable that mirrors the first source Observable to emit an item.
- *
- * ## Example
- * ### Subscribes to the observable that was the first to start emitting.
- *
- * ```ts
- * import { race, interval } from 'rxjs';
- * import { mapTo } 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'));
- *
- * race(obs3, obs1, obs2)
- * .subscribe(
- * winner => console.log(winner)
- * );
- *
- * // result:
- * // a series of 'fast one'
- * ```
- *
- * @param {...Observables} ...observables sources used to race for which Observable emits first.
- * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.
- * @static true
- * @name race
- * @owner Observable
- */
-export function race<T>(...observables: ObservableInput<any>[]): Observable<T> {
- // if the only argument is an array, it was most likely called with
- // `race([obs1, obs2, ...])`
- if (observables.length === 1) {
- if (isArray(observables[0])) {
- observables = observables[0] as Observable<any>[];
- } else {
- return observables[0] as Observable<T>;
- }
- }
-
- return fromArray(observables, undefined).lift(new RaceOperator<T>());
-}
-
-export class RaceOperator<T> implements Operator<T, T> {
- call(subscriber: Subscriber<T>, source: any): TeardownLogic {
- return source.subscribe(new RaceSubscriber(subscriber));
- }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class RaceSubscriber<T> extends OuterSubscriber<T, T> {
- private hasFirst: boolean = false;
- private observables: Observable<any>[] = [];
- private subscriptions: Subscription[] = [];
-
- constructor(destination: Subscriber<T>) {
- super(destination);
- }
-
- protected _next(observable: any): void {
- this.observables.push(observable);
- }
-
- protected _complete() {
- const observables = this.observables;
- const len = observables.length;
-
- if (len === 0) {
- this.destination.complete!();
- } else {
- for (let i = 0; i < len && !this.hasFirst; i++) {
- const observable = observables[i];
- const subscription = subscribeToResult(this, observable, undefined, i)!;
-
- if (this.subscriptions) {
- this.subscriptions.push(subscription);
- }
- this.add(subscription);
- }
- this.observables = null!;
- }
- }
-
- notifyNext(_outerValue: T, innerValue: T,
- outerIndex: number): void {
- if (!this.hasFirst) {
- this.hasFirst = true;
-
- for (let i = 0; i < this.subscriptions.length; i++) {
- if (i !== outerIndex) {
- let subscription = this.subscriptions[i];
-
- subscription.unsubscribe();
- this.remove(subscription);
- }
- }
-
- this.subscriptions = null!;
- }
-
- this.destination.next!(innerValue);
- }
-}