@lifaon/rx-js-light
Version:
Blazing fast Observables
55 lines (54 loc) • 1.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createMulticastSource = void 0;
var freeze_1 = require("../../../../../misc/helpers/freeze.cjs");
var noop_1 = require("../../../../../misc/helpers/noop.cjs");
function createMulticastSource() {
var _emitFunctions = [];
var _dispatchingObservers;
var _dispatchingCount = 0;
var cloneObservers = function () {
if (_emitFunctions === _dispatchingObservers) {
_emitFunctions = _emitFunctions.slice();
}
};
var emit = function (value) {
if (_dispatchingCount === 0) {
_dispatchingObservers = _emitFunctions;
_dispatchingCount = _dispatchingObservers.length;
for (var i = 0; _dispatchingCount > 0; i++) {
_dispatchingCount--;
_dispatchingObservers[i](value);
}
} else {
throw new Error("Already dispatching.");
}
};
var subscribe = function (emit) {
var running = true;
if (_dispatchingCount > 0) {
cloneObservers();
}
_emitFunctions.push(emit);
return function () {
if (running) {
running = false;
if (_dispatchingCount > 0) {
cloneObservers();
_dispatchingObservers[_dispatchingObservers.indexOf(emit)] = noop_1.noop;
}
_emitFunctions.splice(_emitFunctions.indexOf(emit), 1);
}
};
};
return (0, freeze_1.freeze)({
getObservers: function () {
return _emitFunctions;
},
emit: emit,
subscribe: subscribe
});
}
exports.createMulticastSource = createMulticastSource;