Skip to content
Clone
163952e
41 lines 875 B
import { useEffect, useState } from 'preact/hooks'
export interface Store<T> {
get(): T
set(value: T): void
reset(): void
subscribe(listener: () => void): () => void
}
export function createStore<T>(initial: T): Store<T> {
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<T>(store: Store<T>): T {
const [value, setValue] = useState(store.get())
useEffect(() => store.subscribe(() => setValue(store.get())), [store])
return value
}