@ezdevlol/memfs
Version:
In-memory file-system with Node's fs API.
41 lines (40 loc) • 942 B
JavaScript
import { go } from './go';
class Task {
code;
resolve;
reject;
promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
constructor(code) {
this.code = code;
}
}
/** Limits concurrency of async code. */
export const concurrency = (limit) => {
let workers = 0;
const queue = new Set();
const work = async () => {
const task = queue.values().next().value;
if (task)
queue.delete(task);
else
return;
workers++;
try {
task.resolve(await task.code());
}
catch (error) {
task.reject(error);
}
finally {
workers--, queue.size && go(work);
}
};
return async (code) => {
const task = new Task(code);
queue.add(task);
return workers < limit && go(work), task.promise;
};
};