group.mjs 706 B

123456789101112131415161718192021222324
  1. const notify = (node) => !node.isLayoutDirty && node.willUpdate(false);
  2. function nodeGroup() {
  3. const nodes = new Set();
  4. const subscriptions = new WeakMap();
  5. const dirtyAll = () => nodes.forEach(notify);
  6. return {
  7. add: (node) => {
  8. nodes.add(node);
  9. subscriptions.set(node, node.addEventListener("willUpdate", dirtyAll));
  10. },
  11. remove: (node) => {
  12. nodes.delete(node);
  13. const unsubscribe = subscriptions.get(node);
  14. if (unsubscribe) {
  15. unsubscribe();
  16. subscriptions.delete(node);
  17. }
  18. dirtyAll();
  19. },
  20. dirty: dirtyAll,
  21. };
  22. }
  23. export { nodeGroup };