Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: James Long <jlongster@users.noreply.github.com> Co-authored-by: 冯基魁 <56265583+fengjikui@users.noreply.github.com> Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com> Co-authored-by: Victor Navarro <vn4varro@gmail.com>
36 lines
1,021 B
TypeScript
36 lines
1,021 B
TypeScript
import { createRoot, type Owner } from "solid-js"
|
|
|
|
type Entry = {
|
|
value: unknown
|
|
dispose: VoidFunction
|
|
}
|
|
|
|
export function createTabMemory(owner: Owner | null) {
|
|
const entries = new Map<string, Map<string, Entry>>()
|
|
|
|
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<T>(key: string, name: string) {
|
|
return entries.get(key)?.get(name)?.value as T | undefined
|
|
},
|
|
ensure<T>(key: string, name: string, init: () => T) {
|
|
const state = entries.get(key) ?? new Map<string, Entry>()
|
|
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)
|
|
},
|
|
}
|
|
}
|