syncers = {
console.log("sync");
const syncers = this || new Map();
syncers.forEach(({ observers }, root) => {
if (!inspectors.has(root)) {
console.log("tidy up syncer for ", root);
syncers.delete(root);
observers.forEach(({ observer, remove }, v) => {
remove();
if (v?._observer?.fulfilled && !!v._value) {
v._observer.fulfilled(v._value, v._name);
}
});
}
});
inspectors.forEach((inspector, root) => {
if (viewof visualizersToDelete.value.has(root)) return;
if (!syncers.has(root)) {
syncers.set(root, {
observers: new Map()
});
}
const { observers } = syncers.get(root);
const seen = new Set();
let i = 0;
const state = {};
const cells = cellMaps.get(root.module);
cells.forEach((cells) => {
const v = cells[0];
if (v._name === "debug_cell") debugger;
if (!root.filter(v, i++, state)) return;
if (visualizers.has(v._value) && v._value.detachNodes) return;
seen.add(v);
if (
observers.has(v) &&
observers.get(v).version == v._version &&
observers.get(v).root == root
) {
// no change
} else {
if (observers.has(v)) {
observers.get(v).remove(); // tidy up previous
}
const observer = inspector(v);
const remove = observe(v, observer, { detachNodes: root.detachNodes });
observers.set(v, {
observer,
version: v._version,
root,
remove: () => {
if (v._name === "debug_cell") debugger;
observers.delete(v);
observer._node.remove();
remove();
}
});
}
});
// remove stale variables
[...observers.entries()].forEach(([v, _]) => {
if (!seen.has(v) && observers.has(v)) {
if (v._name === "debug_cell") debugger;
const { observer, remove } = observers.get(v);
observer.remove();
}
});
// sync dom
root.innerHTML = "";
allVariables.forEach((v) => {
if (observers.has(v)) {
const { observer, remove } = observers.get(v);
root.appendChild(observer._node);
}
});
// let current = root.firstChild;
// allVariables.forEach((v) => {
// if (v._name === "debug_cell") debugger;
// if (observers.has(v)) {
// const { observer, remove } = observers.get(v);
// if (current.variable == v) {
// current = current.nextSibling;
// } else {
// debugger;
// current.before(observer._node);
// }
// }
// });
// // remove left overs
// while (current !== null) {
// const toRemove = current;
// current = current.nextSibling;
// toRemove.remove();
// }
return observers;
});
// tidy up resources
[...viewof visualizersToDelete.value].forEach((root) => {
if (syncers.has(root)) {
const { observers } = syncers.get(root);
[...observers].forEach((v) => {
const { observer, remove } = observers.get(v);
observer.remove();
});
}
syncers.delete(root);
inspectors.delete(root);
viewof visualizersToDelete.value.delete(root);
viewof visualizers.value.delete(root);
});
return syncers;
}