sweet-state
A finite state machine written in TypeScript
Example Usage
Basic Machine Setup (file name: machine.ts)
// 1. import the Machine constructor and StateType enumimport { Machine, StateType } from 'sweet-state'; // 2. set the machine states in an enumexport enum MachineStates { idle = "idle", loading = "loading", error = "error", success = "success"} // 3. create eventsexport enum MachineEvents { submit = 'SUBMIT'} // action callbacks must return type of: Promise<void>function loadingCallback(_: Machine<MachineStates>): Promise<void> { const randomNumber = Math.floor(Math.random() * 2); if (randomNumber === 0) { return Promise.resolve(); } else { const error = new Error("THERE WAS A TERRIBLE ERROR"); // return Promise.reject(error); return new Promise((resolve, reject) => { setTimeout(() => { reject(error); }, 2000); }); }} // 4. set up the statesconst states = { [MachineStates.idle]: { on: { [MachineEvents.submit]: MachineStates.loading } }, [MachineStates.loading]: { action: { callback: loadingCallback, onError: MachineStates.error, onSuccess: MachineStates.success } }, [MachineStates.error]: { on: { [MachineEvents.submit]: MachineStates.loading } }, [MachineStates.success]: { type: StateType.final }} // 5. set the initial stateconst initial = MachineStates.idle; // 6. initialize the machineconst machine = new Machine<MachineStates>({ initial, states}); // 7. start the machinemachine.start();
Listening to state changes
function listenCallback(currentState, error) { // ...do something}machine.listen(listenCallback);
Sending events
machine.send(MachineEvents.submit)