export type AtomKey = string | number | symbol; export type AtomStore = Map; export type AtomStoreUpdate = Record; export type AtomUpdater = (value: Value) => Update; export type AtomValueUpdate = Update | AtomUpdater; export type AtomSelector = (value: Value) => Selected; export type AtomGetter = () => Value; export type AtomSetter = (update: AtomValueUpdate) => Value; export type AtomSubscribe = (next: (value: Value) => void) => () => void; export type Atom = { readonly key: AtomKey; readonly def: Value; get: AtomGetter; set: AtomSetter; sub: AtomSubscribe; }; export type DynamicAtomGetter = (atom: Atom) => Value; export type DynamicAtomSetter = (atom: Atom, update: AtomValueUpdate) => Value;