import type { Draft } from 'immer' import type { KeyTypes, Pick, RecordValue, UnionOfValues } from 'type-plus' import type { Registry, RegistryValue } from './registry.js' import type { Store, StoreValue } from './store.js' export type Adder = (...entries: T[]) => void export type WithAdder = { add: Adder } /** * builds an adder function for a store or registry */ export function adder>( registry: R, handler: (record: Draft>, entry: RecordValue>) => void ): Adder>>> export function adder, S extends Store>( store: S, handler: (record: Draft, entry: UnionOfValues) => void ): Adder> export function adder>>( store: S, handler: (record: Draft>, entry: RecordValue>) => void ): Adder>> export function adder(store: Pick, 'set'>, handler: (record: Draft, entry: T) => void) { return (...entries: T[]) => { store.set((s: any) => entries.forEach(entry => { handler(s, entry) }) ) } } export function withAdder>( registry: R, addEntry: (record: Draft>, entry: RecordValue>) => void ): R & WithAdder>> export function withAdder, S extends Store>( store: S, addEntry: (record: Draft, entry: ReturnType) => void ): S & WithAdder>> export function withAdder>>( store: S, addEntry: (record: Draft>, entry: RecordValue>) => void ): S & WithAdder>> export function withAdder>( store: S, addEntry: (record: Draft>, entry: any) => void ) { return { ...store, add: adder(store, addEntry) } } export function push>(record: Draft, entry: UnionOfValues) { record.push(entry) } export function unshift>(record: Draft, entry: UnionOfValues) { record.unshift(entry) }