'use strict'; const pTry = require('p-try'); module.exports = concurrency => { if (concurrency < 1) { throw new TypeError('Expected `concurrency` to be a number from 1 and up'); } const queue = []; let activeCount = 0; const next = () => { activeCount--; if (queue.length > 0) { queue.shift()(); } }; return fn => new Promise((resolve, reject) => { const run = () => { activeCount++; pTry(fn).then( val => { resolve(val); next(); }, err => { reject(err); next(); } ); }; if (activeCount < concurrency) { run(); } else { queue.push(run); } }); };