add gateway

initial state still huge problem
This commit is contained in:
Seth Trowbridge 2025-02-03 22:57:13 -05:00
parent d4aa91fe70
commit 1e268be742

View File

@ -119,6 +119,7 @@ let handler = ns => ({get: (_, name) => tag.bind(_undefined, ns, name)})
let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) : dom.remove() let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) : dom.remove()
//let updateDoms = () => { //let updateDoms = () => {
// let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal) // let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
// do { // do {
@ -133,22 +134,41 @@ let update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom)
// for (let s of changedStatesArray) s._oldVal = s.rawVal // for (let s of changedStatesArray) s._oldVal = s.rawVal
//} //}
/*********************************************** */ /*********************************************** */
// Map to track state-to-DOM relationships const Gateway = {
const stateDomMap = new Map(); Time: 0,
function pathHash(/** @type {HTMLElement} */element) { Temp:{},
const path = []; Tick()
let currentElement = element; {
for(let k in Gateway.Temp)
while (currentElement && currentElement !== document.body && currentElement.parentNode) { {
const siblings = Array.from(currentElement.parentNode.children); localStorage.setItem(k, Gateway.Temp[k]);
const index = siblings.indexOf(currentElement);
path.unshift(index); // Push the index of the current element at the start of the path
currentElement = currentElement.parentNode;
} }
Gateway.Temp = {};
Gateway.Time = 0;
},
Save(key, value)
{
Gateway.Temp[key] = value;
if(!Gateway.Time)
{
Gateway.Time = setTimeout(Gateway.Tick, 500);
}
},
Load(key)
{
return localStorage.getItem(key);
}
}
// Include the body in the path as the final part, with index 0 (since it's the root) function pathHash(/** @type {HTMLElement} */element)
path.unshift(0); {
const path = [];
while (element && element !== document.body) {
const parent = element.parentElement
path.unshift(Array.from(parent.children).indexOf(element)); // Push the index of the current element at the start of the path
element = parent;
}
return path.join('-'); // Return the path as a string, e.g., "1-0-0-2" return path.join('-'); // Return the path as a string, e.g., "1-0-0-2"
} }
@ -159,33 +179,28 @@ function pathHash(/** @type {HTMLElement} */element) {
*/ */
const trackStateDomRelationship = (state, doms) => { const trackStateDomRelationship = (state, doms) => {
doms.forEach(dom => { doms.forEach(dom => {
if(dom)
{
const hash = pathHash(dom); const hash = pathHash(dom);
stateDomMap.set(hash, state); Gateway.Save(hash, JSON.stringify(state));
}
}); });
}; };
// Enhanced updateDoms function // Enhanced updateDoms function
let updateDoms = () => { let updateDoms = () => {
let iter = 0; let iter = 0, derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
let derivedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal);
do { do {
// Clear derivedStates for this iteration derivedStates = new Set
derivedStates = new Set(); for (let l of new Set(derivedStatesArray.flatMap(s => s._listeners = keepConnected(s._listeners))))
derive(l.f, l.s, l._dom), l._dom = _undefined
// Process listeners for derived states } while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length)
for (let l of new Set(derivedStatesArray.flatMap(s => s._listeners = keepConnected(s._listeners)))) { let changedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal)
derive(l.f, l.s, l._dom); changedStates = _undefined
l._dom = _undefined;
}
} while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length);
// Update bindings for changed states
let changedStatesArray = [...changedStates].filter(s => s.rawVal !== s._oldVal);
changedStates = _undefined;
const _block = new Set(changedStatesArray.flatMap(s =>{ const _block = new Set(changedStatesArray.flatMap(s =>{
trackStateDomRelationship(s.rawVal, s._bindings.map(b=>b._dom)) trackStateDomRelationship(s.rawVal, s._bindings.map(b=>b._dom));
s.rawVal = "FORCE";
return s._bindings = keepConnected(s._bindings); return s._bindings = keepConnected(s._bindings);
})); }));
@ -201,7 +216,7 @@ let updateDoms = () => {
}; };
// Debugging helper to log the state-DOM relationships // Debugging helper to log the state-DOM relationships
globalThis.Divulge = () => console.log(stateDomMap.entries()); globalThis.Divulge = () => console.log(Gateway.Temp);
globalThis.path = pathHash; globalThis.path = pathHash;
/*********************************************** */ /*********************************************** */