import { type KeyTypes, pick, type Widen } from 'type-plus' import type { OnStateChange, ResetState, SetState, StateMeta } from './state.js' import { createStore } from './store.js' export type ReadonlyRegistry = { get(): Record onChange: OnStateChange> keys(): K[] has(key: K): boolean size(): number values(): T[] } export type Registry = ReadonlyRegistry & { set: SetState> reset: ResetState } /** * Gets the Value type of the Registry (the `Record`) */ export type RegistryValue> = ReturnType export function createRegistry( init = {} as Record, meta?: StateMeta ): Registry, T> { const store = createStore, T>>(init as any, meta) return { ...store, keys() { const r = store.get() return [...Object.keys(r), ...Object.getOwnPropertySymbols(r)] as Widen[] }, has(key) { return store.get()[key] !== undefined }, size() { return this.keys().length }, values(): T[] { const r = store.get() return this.keys().map(k => r[k]) } } } export function toReadonlyRegistry>( registry: S ): S extends Registry ? ReadonlyRegistry : never { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return pick(registry, 'get', 'has', 'onChange', 'keys', 'size', 'values') as any }