Finitus
A flexible finite state machine.
Installation
Get the distribution package from npm:
npm install finitus
Or source material from git:
git clone https://github.com/jonoco/finitus.git
Useage
Create the machines
Import the finite state machine (FSM) object, Action, and any optional premade actions.
const FSM Action sendEvent = ;
Create the state machines.
// Creation order will determine the order of evaluationconst switchSM = FSM;const handSM = FSM;
Add states to the state machines.
// The first state added to a machine will become the initial stateswitchSM;switchSM;handSM;
Link states together.
// Creates unidirectional link: Off -> OnswitchSM;
Create a new Action.
// All Actions must be Async Functions and return true on successful completionconst logMessage = async { console; return true;}
Add actions to the state machine's states.
switchSM;handSM;
Evaluate all state machines.
Evaluating this particular state changes will take a maximum of three evaluation cycles. This can be done by chaining promises together, via an asynchronous loop, or using the built in looping method.
Chaining:
FSM ;
Async loop:
const asyncLoop = async { for let i = 0 ; i < 3 ; i++ await FSM; console; };
Internal loop:
FSM; // Will loop continuously in 10 ms cycles.
Expected output.
Using the Promise chaining method:
Switch: evaluating state of machine
Switch: current state is Off
Hand: evaluating state of machine
Hand: current state is Flicking
>> first evaluation complete
Switch: evaluating state of machine
Switch: current state is Off
Switch: received actionable event: flick on
Switch: changing state from Off to On
Hand: evaluating state of machine
Hand: current state is Flicking
>> second evaluation complete
Switch: evaluating state of machine
Switch: current state is On
light on
Hand: evaluating state of machine
Hand: current state is Flicking
>> third evaluation complete
Lifecycle
- Evaluate ->
- Check if state has not evaluated or is set to loop ->
- State machine runs actions on current state ->
- State machine processes event queue ->
- Signal the evaluation is complete