text: "use strict";
  Object.defineProperty(exports, "__esModule", { value: true });
  var Observable_1 = require("./Observable");
  function multiplex(inner) {
      var observers = new Set();
      var sub = null;
      return new Observable_1.Observable(function (observer) {
          observers.add(observer);
          sub = sub || inner.subscribe({
              next: function (value) {
                  observers.forEach(function (obs) { return obs.next && obs.next(value); });
              },
              error: function (error) {
                  observers.forEach(function (obs) { return obs.error && obs.error(error); });
              },
              complete: function () {
                  observers.forEach(function (obs) { return obs.complete && obs.complete(); });
              },
          });
          return function () {
              if (observers.delete(observer) && !observers.size && sub) {
                  sub.unsubscribe();
                  sub = null;
              }
          };
      });
  }
  exports.multiplex = multiplex;
  function asyncMap(observable, mapFn) {
      return new Observable_1.Observable(function (observer) {
          var next = observer.next, error = observer.error, complete = observer.complete;
          var activeNextCount = 0;
          var completed = false;
          var handler = {
              next: function (value) {
                  ++activeNextCount;
                  new Promise(function (resolve) {
                      resolve(mapFn(value));
                  }).then(function (result) {
                      --activeNextCount;
                      next && next.call(observer, result);
                      completed && handler.complete();
                  }, function (e) {
                      --activeNextCount;
                      error && error.call(observer, e);
                  });
              },
              error: function (e) {
                  error && error.call(observer, e);
              },
              complete: function () {
                  completed = true;
                  if (!activeNextCount) {
                      complete && complete.call(observer);
                  }
              },
          };
          var sub = observable.subscribe(handler);
          return function () { return sub.unsubscribe(); };
      });
  }
  exports.asyncMap = asyncMap;
  //# sourceMappingURL=observables.js.map