@studiometa/js-toolkit
Version:
A set of useful little bits of JavaScript to boost your project! 🚀
54 lines (53 loc) • 1.25 kB
JavaScript
function getScheduler(steps) {
const stepsFns = {};
const api = {};
let isScheduled = false;
const resolvedPromise = Promise.resolve();
function run(tasks) {
let task;
while (task = tasks.shift()) {
task();
}
}
function flush() {
for (const step of steps) {
run(stepsFns[step]);
}
isScheduled = false;
if (steps.reduce((length, step) => length + stepsFns[step].length, 0) > 0) {
scheduleFlush();
}
}
function scheduleFlush() {
if (isScheduled) {
return;
}
isScheduled = true;
resolvedPromise.then(flush);
}
for (const step of steps) {
stepsFns[step] = [];
api[step] = function add(fn) {
stepsFns[step].push(fn);
scheduleFlush();
};
}
return api;
}
const instances = /* @__PURE__ */ new Map();
const domSchedulerSteps = ["read", "write", "afterWrite"];
function useScheduler(steps = domSchedulerSteps) {
const key = steps.join("-");
if (instances.has(key)) {
return instances.get(key);
}
const scheduler = getScheduler(steps);
instances.set(key, scheduler);
return scheduler;
}
const domScheduler = useScheduler(domSchedulerSteps);
export {
domScheduler,
useScheduler
};
//# sourceMappingURL=scheduler.js.map