Finite State Machine implementation, with support for guards and enter/exit events.
$ npm install --save @fabiospampinato/fsm
import FSM from '@fabiospampinato/fsm';
// The keys of a `states` object are the available states
// The value assigned to each key is an object of the following shape:
// {
// transitions: {
// transitionName: '*', // `*` is a special value that points to the current state
// transitionName: 'nextState',
// transitionName: {
// state: 'nextState',
// guard: 'methodToCall', // Passed if the method returns true
// guard: '!methodToCall', // Passed if the method returns false
// guard: 'firstMethodToCall|!secondMethodtoCall' // Passed if all the `|`-separated guards are passed
// }
// }
// }
const states = {
standing: {
transitions: {
walk: {
state: 'walking',
guard: '!isLazy'
}
}
},
walking: {
transitions: {
smile: '*',
stop: 'standing',
speedUp: 'running'
}
},
running: {
transitions: {
slowDown: 'walking'
}
}
};
// A model is an object defining some methods that will be called by the state machine:
// transition: a method with the same name of a transition will be called when that transition happens
// enter handlers: a method with a name of `myStateEnter` will be called when the `myState` state is entered
// exit handlers: a method with a name of `myStateExit` will be called when the `myState` state is exited
// guards: a method with the same name of a guard will be called before doing a transition
const Model = new class {
isLazy () {
return false;
}
smile () {
console.log ( ':D' );
}
walkingEnter () {
console.log ( 'Now I\'m walking' );
}
walkingExit () {
console.log ( 'Now I\'n not walking anymore' );
}
};
const machine = new FSM ( Model, states, 'standing' );
machine.transition ( 'walk' );
machine.transition ( 'smile' );
machine.transition ( 'speedUp' );
machine.transition ( 'slowDown' );
machine.transition ( 'stop' );
Given a model where to look for handlers, a states
object describing the shape of the machine, and an initial state, it returns an instance of FSM.
Returns the current state.
Replaces the current state with state
.
Replaces the current state with the initial state.
Checks if the current state is state
.
Checks if a particular transition could be done.
An alias of .transition
.
If the transition is not doable, or if the next state is invalid it will throw an exception.
Otherwise it will perform the transition, basically: triggers exit
events, if exists calls model's method that have the same name as this transition, triggers enter
events.
- HSM - Hierarchical State Machine implementation, with support for guards and enter/exit events.
MIT © Fabio Spampinato