UNPKG

art-standard-lib

Version:

The Standard Library for JavaScript that aught to be.

90 lines (73 loc) 2.64 kB
// Generated by CoffeeScript 1.12.7 (function() { var Promise, PromiseWorkerPool, log; Promise = require('./Promise'); log = require('./Log').log; /* usage: pwp = new PromiseWorkerPool numWorkers: 10 * queue all your jobs pwp.queue (jobIndex, totalJobCount) -> work, optionally returning promise * jobIndex is the order the worker was queued in * start the queue pwp.then (results) -> * results is the results from all your workerPromises in the same order they were queued */ module.exports = PromiseWorkerPool = (function() { function PromiseWorkerPool(numWorkers1) { this.numWorkers = numWorkers1 != null ? numWorkers1 : 10; this._queue = []; } PromiseWorkerPool.prototype.queue = function(job) { if (this._startPromise) { throw new Error("already started"); } this._queue.push(job); return this; }; PromiseWorkerPool.prototype.start = function() { return this._startPromise || (this._startPromise = Promise.then((function(_this) { return function() { var doNextAction, jobIndex, numJobs, numWorkers, results, workerPromises; jobIndex = 0; doNextAction = function() { var currentJobIndex, job; if (_this._queue.length > (currentJobIndex = jobIndex)) { jobIndex++; if (job = _this._queue[currentJobIndex]) { _this._queue[currentJobIndex] = null; return Promise.then(function() { return job(currentJobIndex, numJobs); }).then(function(result) { return results[currentJobIndex] = result; }).then(doNextAction); } else { return Promise.then(doNextAction); } } else { return Promise.resolve("queue done"); } }; results = new Array(numJobs = _this._queue.length); workerPromises = []; numWorkers = _this.numWorkers; while (workerPromises.length < numWorkers) { workerPromises.push(doNextAction()); } return Promise.all(workerPromises).then(function() { return results; }); }; })(this))); }; PromiseWorkerPool.prototype.then = function(a, b) { return this.start().then(a, b); }; PromiseWorkerPool.prototype["catch"] = function(a) { return this.start()["catch"](a); }; return PromiseWorkerPool; })(); }).call(this); //# sourceMappingURL=PromiseWorkerPool.js.map