text: "use strict";
  var __extends = (this && this.__extends) || function (d, b) {
      for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
      function __() { this.constructor = d; }
      d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  };
  var isArray_1 = require('../util/isArray');
  var ArrayObservable_1 = require('../observable/ArrayObservable');
  var OuterSubscriber_1 = require('../OuterSubscriber');
  var subscribeToResult_1 = require('../util/subscribeToResult');
  /* tslint:disable:max-line-length */
  /**
   * Returns an Observable that mirrors the first source Observable to emit an item
   * from the combination of this Observable and supplied Observables
   * @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.
   * @method race
   * @owner Observable
   */
  function race() {
      var observables = [];
      for (var _i = 0; _i < arguments.length; _i++) {
          observables[_i - 0] = arguments[_i];
      }
      // if the only argument is an array, it was most likely called with
      // `pair([obs1, obs2, ...])`
      if (observables.length === 1 && isArray_1.isArray(observables[0])) {
          observables = observables[0];
      }
      return this.lift.call(raceStatic.apply(void 0, [this].concat(observables)));
  }
  exports.race = race;
  function raceStatic() {
      var observables = [];
      for (var _i = 0; _i < arguments.length; _i++) {
          observables[_i - 0] = arguments[_i];
      }
      // if the only argument is an array, it was most likely called with
      // `pair([obs1, obs2, ...])`
      if (observables.length === 1) {
          if (isArray_1.isArray(observables[0])) {
              observables = observables[0];
          }
          else {
              return observables[0];
          }
      }
      return new ArrayObservable_1.ArrayObservable(observables).lift(new RaceOperator());
  }
  exports.raceStatic = raceStatic;
  var RaceOperator = (function () {
      function RaceOperator() {
      }
      RaceOperator.prototype.call = function (subscriber, source) {
          return source.subscribe(new RaceSubscriber(subscriber));
      };
      return RaceOperator;
  }());
  exports.RaceOperator = RaceOperator;
  /**
   * We need this JSDoc comment for affecting ESDoc.
   * @ignore
   * @extends {Ignored}
   */
  var RaceSubscriber = (function (_super) {
      __extends(RaceSubscriber, _super);
      function RaceSubscriber(destination) {
          _super.call(this, destination);
          this.hasFirst = false;
          this.observables = [];
          this.subscriptions = [];
      }
      RaceSubscriber.prototype._next = function (observable) {
          this.observables.push(observable);
      };
      RaceSubscriber.prototype._complete = function () {
          var observables = this.observables;
          var len = observables.length;
          if (len === 0) {
              this.destination.complete();
          }
          else {
              for (var i = 0; i < len && !this.hasFirst; i++) {
                  var observable = observables[i];
                  var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
                  if (this.subscriptions) {
                      this.subscriptions.push(subscription);
                  }
                  this.add(subscription);
              }
              this.observables = null;
          }
      };
      RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
          if (!this.hasFirst) {
              this.hasFirst = true;
              for (var i = 0; i < this.subscriptions.length; i++) {
                  if (i !== outerIndex) {
                      var subscription = this.subscriptions[i];
                      subscription.unsubscribe();
                      this.remove(subscription);
                  }
              }
              this.subscriptions = null;
          }
          this.destination.next(innerValue);
      };
      return RaceSubscriber;
  }(OuterSubscriber_1.OuterSubscriber));
  exports.RaceSubscriber = RaceSubscriber;
  //# sourceMappingURL=race.js.map