import { useEffect, useState } from 'react' export interface Store { get(): T set(value: T): void reset(): void subscribe(listener: () => void): () => void } export function createStore(initial: T): Store { let value = initial const listeners = new Set<() => void>() const notify = () => { listeners.forEach((listener) => { listener() }) } return { get: () => value, set: (next) => { value = next notify() }, reset: () => { value = initial notify() }, subscribe: (listener) => { listeners.add(listener) return () => { listeners.delete(listener) } }, } } export function useStore(store: Store): T { const [value, setValue] = useState(store.get()) useEffect(() => store.subscribe(() => setValue(store.get())), [store]) return value }