import { createRoot, type Owner } from "solid-js" type Entry = { value: unknown dispose: VoidFunction } export function createTabMemory(owner: Owner | null) { const entries = new Map>() const remove = (key: string) => { const state = entries.get(key) if (!state) return for (const entry of state.values()) entry.dispose() entries.delete(key) } return { get(key: string, name: string) { return entries.get(key)?.get(name)?.value as T | undefined }, ensure(key: string, name: string, init: () => T) { const state = entries.get(key) ?? new Map() if (!entries.has(key)) entries.set(key, state) const existing = state.get(name) if (existing) return existing.value as T const entry = createRoot((dispose) => ({ value: init(), dispose }), owner) state.set(name, entry) return entry.value }, remove, dispose() { for (const key of entries.keys()) remove(key) }, } }