Repositorio del curso CCOM4030 el semestre B91 del proyecto Artesanías con el Instituto de Cultura

race.ts 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { Observable } from '../Observable';
  2. import { isArray } from '../util/isArray';
  3. import { fromArray } from './fromArray';
  4. import { Operator } from '../Operator';
  5. import { Subscriber } from '../Subscriber';
  6. import { Subscription } from '../Subscription';
  7. import { TeardownLogic, ObservableInput } from '../types';
  8. import { OuterSubscriber } from '../OuterSubscriber';
  9. import { InnerSubscriber } from '../InnerSubscriber';
  10. import { subscribeToResult } from '../util/subscribeToResult';
  11. // tslint:disable:max-line-length
  12. export function race<A>(arg: [ObservableInput<A>]): Observable<A>;
  13. export function race<A, B>(arg: [ObservableInput<A>, ObservableInput<B>]): Observable<A | B>;
  14. export function race<A, B, C>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<A | B | C>;
  15. export function race<A, B, C, D>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<A | B | C | D>;
  16. 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>;
  17. export function race<T>(arg: ObservableInput<T>[]): Observable<T>;
  18. export function race(arg: ObservableInput<any>[]): Observable<{}>;
  19. export function race<A>(a: ObservableInput<A>): Observable<A>;
  20. export function race<A, B>(a: ObservableInput<A>, b: ObservableInput<B>): Observable<A | B>;
  21. export function race<A, B, C>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>): Observable<A | B | C>;
  22. export function race<A, B, C, D>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>): Observable<A | B | C | D>;
  23. 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>;
  24. // tslint:enable:max-line-length
  25. export function race<T>(observables: ObservableInput<T>[]): Observable<T>;
  26. export function race(observables: ObservableInput<any>[]): Observable<{}>;
  27. export function race<T>(...observables: ObservableInput<T>[]): Observable<T>;
  28. export function race(...observables: ObservableInput<any>[]): Observable<{}>;
  29. /**
  30. * Returns an Observable that mirrors the first source Observable to emit an item.
  31. *
  32. * ## Example
  33. * ### Subscribes to the observable that was the first to start emitting.
  34. *
  35. * ```ts
  36. * import { race, interval } from 'rxjs';
  37. * import { mapTo } from 'rxjs/operators';
  38. *
  39. * const obs1 = interval(1000).pipe(mapTo('fast one'));
  40. * const obs2 = interval(3000).pipe(mapTo('medium one'));
  41. * const obs3 = interval(5000).pipe(mapTo('slow one'));
  42. *
  43. * race(obs3, obs1, obs2)
  44. * .subscribe(
  45. * winner => console.log(winner)
  46. * );
  47. *
  48. * // result:
  49. * // a series of 'fast one'
  50. * ```
  51. *
  52. * @param {...Observables} ...observables sources used to race for which Observable emits first.
  53. * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.
  54. * @static true
  55. * @name race
  56. * @owner Observable
  57. */
  58. export function race<T>(...observables: ObservableInput<any>[]): Observable<T> {
  59. // if the only argument is an array, it was most likely called with
  60. // `race([obs1, obs2, ...])`
  61. if (observables.length === 1) {
  62. if (isArray(observables[0])) {
  63. observables = observables[0] as Observable<any>[];
  64. } else {
  65. return observables[0] as Observable<T>;
  66. }
  67. }
  68. return fromArray(observables, undefined).lift(new RaceOperator<T>());
  69. }
  70. export class RaceOperator<T> implements Operator<T, T> {
  71. call(subscriber: Subscriber<T>, source: any): TeardownLogic {
  72. return source.subscribe(new RaceSubscriber(subscriber));
  73. }
  74. }
  75. /**
  76. * We need this JSDoc comment for affecting ESDoc.
  77. * @ignore
  78. * @extends {Ignored}
  79. */
  80. export class RaceSubscriber<T> extends OuterSubscriber<T, T> {
  81. private hasFirst: boolean = false;
  82. private observables: Observable<any>[] = [];
  83. private subscriptions: Subscription[] = [];
  84. constructor(destination: Subscriber<T>) {
  85. super(destination);
  86. }
  87. protected _next(observable: any): void {
  88. this.observables.push(observable);
  89. }
  90. protected _complete() {
  91. const observables = this.observables;
  92. const len = observables.length;
  93. if (len === 0) {
  94. this.destination.complete!();
  95. } else {
  96. for (let i = 0; i < len && !this.hasFirst; i++) {
  97. const observable = observables[i];
  98. const subscription = subscribeToResult(this, observable, undefined, i)!;
  99. if (this.subscriptions) {
  100. this.subscriptions.push(subscription);
  101. }
  102. this.add(subscription);
  103. }
  104. this.observables = null!;
  105. }
  106. }
  107. notifyNext(_outerValue: T, innerValue: T,
  108. outerIndex: number): void {
  109. if (!this.hasFirst) {
  110. this.hasFirst = true;
  111. for (let i = 0; i < this.subscriptions.length; i++) {
  112. if (i !== outerIndex) {
  113. let subscription = this.subscriptions[i];
  114. subscription.unsubscribe();
  115. this.remove(subscription);
  116. }
  117. }
  118. this.subscriptions = null!;
  119. }
  120. this.destination.next!(innerValue);
  121. }
  122. }