-
Notifications
You must be signed in to change notification settings - Fork 0
/
StateMachine.ts
44 lines (35 loc) · 1.1 KB
/
StateMachine.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
export type States<State extends string, Action extends string> = Record<State, Record<string, {
to: State,
actions?: Action[]
}>>;
type StateMachineSettings<State extends string, Action extends string> = {
initState: State;
actions: Record<Action, Function>;
states: States<State, Action>;
}
export class StateMachine<State extends string, Action extends string> {
_current: State;
actions: StateMachineSettings<State, Action>["actions"] = {} as Record<Action, Function>;
states: States<State, Action>;
constructor(settings: StateMachineSettings<State, Action>) {
this._current = settings.initState
this.actions = settings.actions
this.states = settings.states
}
emit(eventName: string): void {
let state = this.states[this._current];
let transition = state[eventName];
if (!transition) {
return;
}
let oldState = this._current
let newState = transition.to
this._current = newState
transition.actions?.forEach((fnName) => {
this.actions[fnName]?.call(this, oldState, newState)
})
}
getState() {
return this._current
}
}