type Listener = (state: T, prevState: T) => void export type Store = { getState: () => T setState: (partial: Partial | ((prev: T) => T), action?: string) => void subscribe: (listener: Listener) => () => void } export function createStore(initialState: T): Store { let state: T = initialState const listeners = new Set>() const getState = () => state const setState: Store['setState'] = (partial) => { const prevState = state const nextState = typeof partial === 'function' ? (partial as (prev: T) => T)(prevState) : ({ ...prevState, ...partial } as T) if (Object.is(nextState, prevState)) return state = nextState listeners.forEach((l) => l(state, prevState)) } const subscribe: Store['subscribe'] = (listener) => { listeners.add(listener) return () => listeners.delete(listener) } return { getState, setState, subscribe } }