/ state / store.ts
store.ts
 1  type Listener = () => void
 2  type OnChange<T> = (args: { newState: T; oldState: T }) => void
 3  
 4  export type Store<T> = {
 5    getState: () => T
 6    setState: (updater: (prev: T) => T) => void
 7    subscribe: (listener: Listener) => () => void
 8  }
 9  
10  export function createStore<T>(
11    initialState: T,
12    onChange?: OnChange<T>,
13  ): Store<T> {
14    let state = initialState
15    const listeners = new Set<Listener>()
16  
17    return {
18      getState: () => state,
19  
20      setState: (updater: (prev: T) => T) => {
21        const prev = state
22        const next = updater(prev)
23        if (Object.is(next, prev)) return
24        state = next
25        onChange?.({ newState: next, oldState: prev })
26        for (const listener of listeners) listener()
27      },
28  
29      subscribe: (listener: Listener) => {
30        listeners.add(listener)
31        return () => listeners.delete(listener)
32      },
33    }
34  }