axax
Version:
A library of async iterator extensions for JavaScript including ```map```, ```reduce```, ```filter```, ```flatMap```, ```pipe``` and [more](https://github.com/jamiemccrindle/axax/blob/master/docs/API.md#functions).
53 lines (52 loc) • 1.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var subject_1 = require("./subject");
var toCallbacks_1 = require("./toCallbacks");
/**
* Combines iterables
*
* @param sources the iterables to combine
*/
function combineLatest() {
var sources = [];
for (var _i = 0; _i < arguments.length; _i++) {
sources[_i] = arguments[_i];
}
var results = new Array(sources.length);
var resultsAvailable = new Array(sources.length).fill(false);
var subject = new subject_1.Subject();
var done = false;
subject.finally(function () {
done = true;
});
var doneCount = 0;
sources.map(function (source, index) {
return toCallbacks_1.toCallbacks(function (result) {
if (result.done) {
doneCount += 1;
if (doneCount >= sources.length) {
done = true;
return subject.callback({ done: true, value: [] });
}
}
if (done) {
throw new toCallbacks_1.StopError();
}
else if (!result.done) {
results[index] = result.value;
resultsAvailable[index] = true;
if (resultsAvailable.every(function (value) { return value; })) {
return subject.callback({ done: false, value: Array.from(results) });
}
else {
return Promise.resolve();
}
}
else {
return Promise.resolve();
}
})(source);
});
return subject.iterator;
}
exports.combineLatest = combineLatest;