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).
45 lines (44 loc) • 1.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var deferred_1 = require("./deferred");
var subject_1 = require("./subject");
var toCallbacks_1 = require("./toCallbacks");
/**
* Runs a mapping function over an asynchronous iterable
*/
function concurrentMap(mapper, concurrency) {
return function inner(source) {
var subject = new subject_1.Subject();
var done = false;
subject.finally(function () {
done = true;
});
var running = 0;
var deferred = new deferred_1.Deferred();
toCallbacks_1.toCallbacks(function (result) {
if (done) {
throw new toCallbacks_1.StopError();
}
if (!result.done) {
running += 1;
if (running >= concurrency) {
deferred = new deferred_1.Deferred();
}
mapper(result.value).then(function (value) {
running -= 1;
subject.onNext(value);
if (running < concurrency) {
deferred.resolve();
}
});
return deferred.promise;
}
else {
subject.onCompleted();
return Promise.resolve();
}
})(source);
return subject.iterator;
};
}
exports.concurrentMap = concurrentMap;