"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