19 lines
553 B
JavaScript
19 lines
553 B
JavaScript
import { simpleBox } from "svelte-toolbelt";
|
|
export class StateMachine {
|
|
state;
|
|
#machine;
|
|
constructor(initialState, machine) {
|
|
this.state = simpleBox(initialState);
|
|
this.#machine = machine;
|
|
this.dispatch = this.dispatch.bind(this);
|
|
}
|
|
#reducer(event) {
|
|
// @ts-expect-error state.current is keyof M
|
|
const nextState = this.#machine[this.state.current][event];
|
|
return nextState ?? this.state.current;
|
|
}
|
|
dispatch(event) {
|
|
this.state.current = this.#reducer(event);
|
|
}
|
|
}
|