UNPKG

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
"use strict"; 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;