Skip to content

Instantly share code, notes, and snippets.

@kossnocorp
Created September 8, 2019 09:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kossnocorp/f0d32fb1168e628038e435b52cd24992 to your computer and use it in GitHub Desktop.
Save kossnocorp/f0d32fb1168e628038e435b52cd24992 to your computer and use it in GitHub Desktop.
export type Setter<State> = (currentState: State) => State
export type Listener<State> = (
newState: State,
prevState: State | undefined
) => void
export default function createState<State>() {
let currentState: State
let listener: Listener<State>
const setters: Setter<State>[] = []
let updateTimeout: number
function get(): State {
return currentState
}
function set(setter: Setter<State>): void {
setters.push(setter)
clearTimeout(updateTimeout)
updateTimeout = setTimeout(() => {
const newState = setters.reduce((s, setter) => setter(s), currentState)
const prevState = currentState
currentState = newState
listener(newState, prevState)
})
}
function start(initialState: State, listenerArg: Listener<State>) {
currentState = initialState
listener = listenerArg
listener(initialState, undefined)
}
return { get, set, start }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment