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.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const deferred_1 = require("./deferred"); const subject_1 = require("./subject"); const toCallbacks_1 = require("./toCallbacks"); /** * Runs a mapping function over an asynchronous iterable */ function concurrentMap(mapper, concurrency) { return function inner(source) { const subject = new subject_1.Subject(); let done = false; subject.finally(() => { done = true; }); let running = 0; let deferred = new deferred_1.Deferred(); toCallbacks_1.toCallbacks(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(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;