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 }; }