|  | 'use strict'; | 
|  | const pTry = require('p-try'); | 
|  |  | 
|  | const pLimit = concurrency => { | 
|  | if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) { | 
|  | return Promise.reject(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()(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | const run = (fn, resolve, ...args) => { | 
|  | activeCount++; | 
|  |  | 
|  | const result = pTry(fn, ...args); | 
|  |  | 
|  | resolve(result); | 
|  |  | 
|  | result.then(next, next); | 
|  | }; | 
|  |  | 
|  | const enqueue = (fn, resolve, ...args) => { | 
|  | if (activeCount < concurrency) { | 
|  | run(fn, resolve, ...args); | 
|  | } else { | 
|  | queue.push(run.bind(null, fn, resolve, ...args)); | 
|  | } | 
|  | }; | 
|  |  | 
|  | const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args)); | 
|  | Object.defineProperties(generator, { | 
|  | activeCount: { | 
|  | get: () => activeCount | 
|  | }, | 
|  | pendingCount: { | 
|  | get: () => queue.length | 
|  | } | 
|  | }); | 
|  |  | 
|  | return generator; | 
|  | }; | 
|  |  | 
|  | module.exports = pLimit; | 
|  | module.exports.default = pLimit; |