import type { ReadableFamilyToken, ReadableToken, ViewOf } from "atom.io" import type { Canonical } from "atom.io/foundations/canonical" import { type Store, withdraw } from "../store/index.ts" import { ensureState } from "./ensure-state.ts" import { getFallback } from "./get-fallback.ts" import { readOrComputeValue } from "./read-or-compute-value.ts" export function getFromStore( store: Store, token: ReadableToken, ): ViewOf export function getFromStore( store: Store, token: ReadableFamilyToken, key: NoInfer, ): ViewOf export function getFromStore( store: Store, ...params: | [token: ReadableFamilyToken, key: NoInfer] | [token: ReadableToken] ): ViewOf export function getFromStore( store: Store, ...params: | [token: ReadableFamilyToken, key: NoInfer] | [token: ReadableToken] ): ViewOf { const { token, family, subKey } = ensureState(store, ...params) if (`counterfeit` in token && family && subKey) { return getFallback(store, token, family, subKey) } const state = withdraw(store, token) return readOrComputeValue(store, state) }