import type { AtomFamilyToken, AtomIOToken, AtomToken, HeldSelectorFamilyToken, HeldSelectorToken, MutableAtomFamilyToken, MutableAtomToken, PureSelectorFamilyToken, PureSelectorToken, ReadableFamilyToken, ReadableToken, ReadonlyHeldSelectorFamilyToken, ReadonlyHeldSelectorToken, ReadonlyPureSelectorFamilyToken, ReadonlyPureSelectorToken, ReadonlySelectorFamilyToken, ReadonlySelectorToken, RegularAtomFamilyToken, RegularAtomToken, SelectorFamilyToken, SelectorToken, TimelineFamilyToken, TimelineManageable, TimelineToken, TransactionToken, WritableFamilyToken, WritableHeldSelectorFamilyToken, WritableHeldSelectorToken, WritablePureSelectorFamilyToken, WritablePureSelectorToken, WritableSelectorFamilyToken, WritableSelectorToken, WritableToken, } from "atom.io" import { NotFoundError } from "atom.io" import type { Canonical } from "atom.io/foundations/canonical" import type { Transceiver } from "../mutable/index.ts" import type { Atom, AtomFamily, AtomIOInternalResource, HeldSelector, HeldSelectorFamily, MutableAtom, MutableAtomFamily, PureSelector, PureSelectorFamily, ReadableFamily, ReadableState, ReadonlyHeldSelector, ReadonlyHeldSelectorFamily, ReadonlyPureSelector, ReadonlyPureSelectorFamily, ReadonlySelector, ReadonlySelectorFamily, RegularAtom, RegularAtomFamily, Selector, SelectorFamily, WritableFamily, WritableHeldSelector, WritableHeldSelectorFamily, WritablePureSelector, WritablePureSelectorFamily, WritableSelector, WritableSelectorFamily, WritableState, } from "../state-types.ts" import type { Timeline, TimelineFamily } from "../timeline/index.ts" import type { Transaction } from "../transaction/index.ts" import type { Fn } from "../utility-types.ts" import type { Store } from "./store.ts" export function withdraw( store: Store, token: RegularAtomToken, ): RegularAtom export function withdraw>( store: Store, token: MutableAtomToken, ): MutableAtom export function withdraw( store: Store, token: AtomToken, ): Atom export function withdraw( store: Store, token: WritableHeldSelectorToken, ): WritableHeldSelector export function withdraw( store: Store, token: ReadonlyHeldSelectorToken, ): ReadonlyHeldSelector export function withdraw( store: Store, token: WritablePureSelectorToken, ): WritablePureSelector export function withdraw( store: Store, token: ReadonlyPureSelectorToken, ): ReadonlyPureSelector export function withdraw( store: Store, token: ReadonlySelectorToken, ): ReadonlySelector export function withdraw( store: Store, token: WritableSelectorToken, ): WritableSelector export function withdraw( store: Store, token: HeldSelectorToken, ): HeldSelector export function withdraw( store: Store, token: PureSelectorToken, ): PureSelector export function withdraw( store: Store, token: SelectorToken, ): Selector export function withdraw( store: Store, token: WritableToken, ): WritableState export function withdraw( store: Store, token: ReadableToken, ): ReadableState export function withdraw( store: Store, token: RegularAtomFamilyToken, ): RegularAtomFamily export function withdraw< T extends Transceiver, K extends Canonical, >(store: Store, token: MutableAtomFamilyToken): MutableAtomFamily export function withdraw( store: Store, token: AtomFamilyToken, ): AtomFamily export function withdraw( store: Store, token: ReadonlyHeldSelectorFamilyToken, ): ReadonlyHeldSelectorFamily export function withdraw( store: Store, token: WritableHeldSelectorFamilyToken, ): WritableHeldSelectorFamily export function withdraw( store: Store, token: ReadonlyPureSelectorFamilyToken, ): ReadonlyPureSelectorFamily export function withdraw( store: Store, token: WritablePureSelectorFamilyToken, ): WritablePureSelectorFamily export function withdraw( store: Store, token: ReadonlySelectorFamilyToken, ): ReadonlySelectorFamily export function withdraw( store: Store, token: WritableSelectorFamilyToken, ): WritableSelectorFamily export function withdraw( store: Store, token: HeldSelectorFamilyToken, ): HeldSelectorFamily export function withdraw( store: Store, token: PureSelectorFamilyToken, ): PureSelectorFamily export function withdraw( store: Store, token: SelectorFamilyToken, ): SelectorFamily export function withdraw( store: Store, token: WritableFamilyToken, ): WritableFamily export function withdraw( store: Store, token: ReadableFamilyToken, ): ReadableFamily export function withdraw( store: Store, token: TransactionToken, ): Transaction export function withdraw( store: Store, token: TimelineFamilyToken, ): TimelineFamily export function withdraw( store: Store, token: TimelineToken, ): Timeline export function withdraw( store: Store, token: WritableToken, ): WritableState export function withdraw( store: Store, token: ReadableToken, ): ReadableState export function withdraw( store: Store, token: AtomIOToken, ): AtomIOInternalResource export function withdraw( store: Store, token: AtomIOToken, ): AtomIOInternalResource { let withdrawn: AtomIOInternalResource | undefined let target: Store | null = store while (target !== null) { switch (token.type) { case `atom`: case `mutable_atom`: withdrawn = target.atoms.get(token.key) break case `writable_pure_selector`: case `writable_held_selector`: withdrawn = target.writableSelectors.get(token.key) break case `readonly_pure_selector`: case `readonly_held_selector`: withdrawn = target.readonlySelectors.get(token.key) break case `atom_family`: case `mutable_atom_family`: case `writable_pure_selector_family`: case `readonly_pure_selector_family`: case `writable_held_selector_family`: case `readonly_held_selector_family`: withdrawn = target.families.get(token.key) break case `timeline`: withdrawn = target.timelines.get(token.key) break case `timeline_family`: withdrawn = target.timelineFamilies.get(token.key) break case `transaction`: withdrawn = target.transactions.get(token.key) break } if (withdrawn) { return withdrawn } target = target.child } throw new NotFoundError(token, store.config.name) }