lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
67 lines • 2.05 kB
JavaScript
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