UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

67 lines 2.05 kB
export const createEffectSystem = (effect, cleanup, ticker) => { const queued = new Map(); const needsCleanUp = cleanup && new WeakSet(); const cleanupCbs = new WeakMap(); const tryRunCleanupCb = (target) => { if (!cleanupCbs.has(target)) return; cleanupCbs.get(target)(); cleanupCbs.delete(target); }; const runEffect = (target, data) => { const result = effect(target, data); typeof result === "function" && cleanupCbs.set(target, result); return result; }; const execute = cleanup ? () => { for (const [target, data] of queued) { if (needsCleanUp.has(target)) { cleanup(target, data); needsCleanUp.delete(target); } tryRunCleanupCb(target); runEffect(target, data) !== false && needsCleanUp.add(target); } queued.clear(); started = false; } : () => { for (const [target, data] of queued) { tryRunCleanupCb(target); runEffect(target, data); } queued.clear(); started = false; }; let started = false; const start = () => { if (started) return; started = true; ticker(execute, true); }; const deleteSystem = cleanup ? (item) => { if (needsCleanUp.has(item)) { cleanup(item, queued.get(item)); needsCleanUp.delete(item); } tryRunCleanupCb(item); queued.delete(item); } : (item) => { tryRunCleanupCb(item); queued.delete(item); }; const addSystem = (item, data) => { if (queued.has(item)) { queued.set(item, data); return; } start(); queued.set(item, data); }; return [addSystem, deleteSystem]; }; //# sourceMappingURL=createEffectSystem.js.map