makina

1.0.0 • Public • Published

makina.js

npm npm

Simple finite state machine. With guard conditions and callbacks

Install

$ npm install --save makina

How to use

Basic example:

import createStateMachine from 'makina';
 
// Some guard conditions
const always = () => true;
const never = () => false;
 
// Create a simple SM
const myStateMachine = createStateMachine({
    initState: 'INIT',
    transitions: [
        ['INIT',   'start',    always,  'STATE1'],
        ['STATE1', 'goBack',   always,  'INIT'],
        ['STATE1', 'continue', always,  'STATE2'],
        ['STATE2', 'goBack',   never,   'INIT'],
        ['STATE2', 'goBack',   always,  'STATE1'],
        ['STATE2', 'finish',   always,  'END']
    ]
});
 
myStateMachine.start().continue().goBack().continue().getState();
// STATE 2

The createStateMachine method receives a state machine config object with only 2 keys:

  • initState: the initial state of the state machine.
  • transitions: a list with the transition definitions. A transition definition has the format:
['from state', 'transitionName', guardCondition, 'to state']

Guard conditions

When a state machine (sm) is in the estate 'from state' and the sm.transitionName(data) method is called, it will return the state 'to state' if guardCondition(data) == true.

If the guard condition is not satisfied but there is another transition definition with the same name and a different guard condition, it will be executed.

const isEven = (n) => n % 2 === 0;
const isOdd = (n) => !isEven(n);
 
const myStateMachine = createStateMachine({
    initState: 'INIT',
    transitions: [
        ['INIT', 'start', isEven, 'STATE1'],
        ['INIT', 'start', isOdd,  'STATE2']
    ]
});
 
myStateMachine.start(2).getState(); // STATE1
myStateMachine.start(1).getState(); // STATE2

Callbacks

You can register a callback to be called after a transition is executed:

const myStateMachine = createStateMachine({
    initState: 'INIT',
    transitions: [
        ['INIT', 'start', always, 'STATE1', (msg) => console.log(msg)]
    ]
});
 
myStateMachine.start('hello callback'); // hello callback

Run tests

$ npm install
$ npm test

Package Sidebar

Install

npm i makina

Weekly Downloads

4

Version

1.0.0

License

MIT

Last publish

Collaborators

  • atabel