//@ts-check import * as Van from "./van.members.js"; const Gateway = { Time: 0, Temp:{}, Tick() { for(let k in Gateway.Temp) { localStorage.setItem(k, Gateway.Temp[k]); } 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); } } /** * HMR Wrapper for Van.state * @template T * @param {T} value - initial value * @param {string} key - Storage ID * @returns {Van.State} */ export default function(value, key) { const type = typeof value; let reader =(data)=>data; let writer =(data)=> data.toString(); if(type === "object") { reader = JSON.parse; writer = JSON.stringify; } else if(type === "number") { reader = parseFloat; } else if(type === "boolean") { reader =(data)=> data === "true"; } const stringValue = Gateway.Load(key); const signal = Van.state(/**@type{T}*/(stringValue ? reader(stringValue) : value)); Van.derive(()=>Gateway.Save(key, writer(signal.val))); return signal; }