UNPKG

@studiometa/js-toolkit

Version:

A set of useful little bits of JavaScript to boost your project! 🚀

54 lines (53 loc) • 1.25 kB
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