UNPKG

blue-iterate

Version:

A collection of streams that work well with promises (through, map, reduce). Through2 with promise support

64 lines (63 loc) 2.76 kB
"use strict"; var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; Object.defineProperty(exports, "__esModule", { value: true }); if (Symbol.asyncIterator === undefined) { (Symbol.asyncIterator) = Symbol.for('asyncIterator'); } function _parallelMap(concurrency, func, iterable) { return __asyncGenerator(this, arguments, function* _parallelMap_1() { const concurrentWork = new Set(); const results = []; let ended = false; const queueNext = () => { const nextVal = iterable.next().then(async ({ done, value }) => { if (done) { ended = true; } else { const mappedValue = await func(value); results.push(mappedValue); } concurrentWork.delete(nextVal); }); concurrentWork.add(nextVal); }; for (let i = 0; i < concurrency; i++) { queueNext(); } while (true) { if (results.length) { yield results.shift(); if (!ended) { queueNext(); continue; } } if (concurrentWork.size === 0) { return; } yield __await(Promise.race(concurrentWork)); } }); } function parallelMap(concurrency, func, iterable) { if (func === undefined) { return curriedFunc => parallelMap(concurrency, curriedFunc); } if (iterable === undefined) { return curriedIterable => parallelMap(concurrency, func, curriedIterable); } return _parallelMap(concurrency, func, iterable); } exports.parallelMap = parallelMap;