/** @typedef {{Save:(key:string, data:object)=>void, Load:(key:string)=>object, ID:string, List:Record<string, object>, Dump:()=>void}} SaveLoad<T=object> */

/** @type {Record<string, SaveLoad>} */
const Master = {};
const Prefix = "SL:";
const Delimiter = "_" 
/** @type {(keyOuter:string)=>SaveLoad} */
function SaveLoad(keyOuter)
{
    /** @type {SaveLoad} */
    const sl = {
        ID: keyOuter,
        Save(key, data)
        {
            localStorage.setItem(Prefix+keyOuter+Delimiter+key, JSON.stringify(data));
        },
        Load(key)
        {
            const obj = JSON.parse( localStorage.getItem(Prefix+keyOuter+Delimiter+key) || "{}" );
            this.List[key] = obj;
            return obj;
        },
        List:{},
        Dump(){this.List = {};}
    };

    Master[keyOuter] = sl;
    return sl;
}

/** @type {()=>void} */
function MassLoad()
{
    let loaded = 0;
    let scanned = 0;
    for (let i = 0; i < localStorage.length; i++) {

        scanned++;

        const fullKey = localStorage.key(i) || "";

        if(fullKey.substring(0, Prefix.length) == Prefix)
        {
            const delim = fullKey.indexOf(Delimiter);
            const typeKey = fullKey.substring(Prefix.length, delim);
            const type = Master[typeKey];
            if(type)
            {
                const actualKey = fullKey.substring(delim+1);
                type.Load(actualKey) && loaded++;   
            }
        }
    }
    console.log("mass load complete. loaded:", loaded, "scanned:", scanned);
}

const Node = SaveLoad("Node");
const Link = SaveLoad("Link");
MassLoad();
console.log(Node.List);
console.log(Link.List);



Node.Save("n1", {name:"n1"});
Node.Save("n2", {name:"n2"});
Link.Save("l1", ["n1", "n2", {time:123}]);

Node.Save("n1", {name:"n1", updated:true});