'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;