import type { AtomFamilyToken, AtomToken, MutableAtomFamilyToken, MutableAtomToken, ReadableFamilyToken, ReadableToken, ReadonlyPureSelectorFamilyToken, ReadonlyPureSelectorToken, RegularAtomFamilyToken, RegularAtomToken, SelectorFamilyToken, SelectorToken, WritableFamilyToken, WritablePureSelectorFamilyToken, WritablePureSelectorToken, WritableToken, } from "atom.io" import type { Canonical } from "atom.io/foundations/canonical" import { stringifyJson } from "atom.io/foundations/json" import { newest } from "../lineage.ts" import type { Transceiver } from "../mutable/index.ts" import type { ReadableState } from "../state-types.ts" import { deposit, type Store } from "../store/index.ts" export function seekInStore< T extends Transceiver, K extends Canonical, Key extends K, >( store: Store, token: MutableAtomFamilyToken, key: Key, ): MutableAtomToken | undefined export function seekInStore( store: Store, token: RegularAtomFamilyToken, key: Key, ): RegularAtomToken | undefined export function seekInStore( store: Store, token: AtomFamilyToken, key: Key, ): AtomToken | undefined export function seekInStore( store: Store, token: WritablePureSelectorFamilyToken, key: Key, ): WritablePureSelectorToken | undefined export function seekInStore( store: Store, token: ReadonlyPureSelectorFamilyToken, key: Key, ): ReadonlyPureSelectorToken | undefined export function seekInStore( store: Store, token: SelectorFamilyToken, key: Key, ): SelectorToken | undefined export function seekInStore( store: Store, token: WritableFamilyToken, key: Key, ): WritableToken | undefined export function seekInStore( store: Store, token: ReadableFamilyToken, key: Key, ): ReadableToken | undefined export function seekInStore( store: Store, token: ReadableFamilyToken, key: Canonical, ): ReadableToken | undefined { const subKey = stringifyJson(key) const fullKey = `${token.key}(${subKey})` const target = newest(store) let state: ReadableState | undefined switch (token.type) { case `atom_family`: case `mutable_atom_family`: state = target.atoms.get(fullKey) break case `writable_held_selector_family`: case `writable_pure_selector_family`: state = target.writableSelectors.get(fullKey) break case `readonly_held_selector_family`: case `readonly_pure_selector_family`: state = target.readonlySelectors.get(fullKey) break } if (state) { return deposit(state) } return state }