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 type { Transceiver } from "../mutable/index.ts" import { type Store, withdraw } from "../store/index.ts" import { DO_NOT_CREATE, mintInStore } from "./mint-in-store.ts" import { seekInStore } from "./seek-in-store.ts" // seek [token 🟧] [inits ⬛] // find [token ✅] [inits ⬛] // mint [token ✅] [inits 🟧] // init [token ✅] [inits ✅] export function findInStore< T extends Transceiver, K extends Canonical, Key extends K, >( store: Store, familyToken: MutableAtomFamilyToken, key: Key, ): MutableAtomToken export function findInStore( store: Store, familyToken: RegularAtomFamilyToken, key: Key, ): RegularAtomToken export function findInStore( store: Store, familyToken: AtomFamilyToken, key: Key, ): AtomToken export function findInStore( store: Store, familyToken: WritablePureSelectorFamilyToken, key: Key, ): WritablePureSelectorToken export function findInStore( store: Store, familyToken: ReadonlyPureSelectorFamilyToken, key: Key, ): ReadonlyPureSelectorToken export function findInStore( store: Store, familyToken: SelectorFamilyToken, key: Key, ): SelectorToken export function findInStore( store: Store, familyToken: WritableFamilyToken, key: Key, ): WritableToken export function findInStore( store: Store, familyToken: ReadableFamilyToken, key: Key, ): ReadableToken export function findInStore( store: Store, familyToken: ReadableFamilyToken, key: Canonical, ): ReadableToken { const family = withdraw(store, familyToken) const existingStateToken = seekInStore(store, familyToken, key) if (existingStateToken) { return existingStateToken } const newStateToken = mintInStore(DO_NOT_CREATE, store, family, key) return newStateToken }