function pLimit(concurrency){
const queue = [];
let activeCount = 0;
const next = ()=>{
if(queue.length>0 && activeCount<concurrency){
activeCount++
const [task,resolve,reject] = queue.shift();
task().then(resolve).catch(reject).finally(()=>{
activeCount--;
next();
})
}
}
return (fn)=>{
return new Promise((resolve,reject)=>{
queue.push([fn.resolve,reject]);
next()
})
}
}