@romainfieve/finite-state-machine
TypeScript icon, indicating that this package has built-in type declarations

0.0.11 • Public • Published

✌️🔗🧭 finite-state-machine

A TypeScript library to work with finite state machines.

Table of Content

Installation

yarn add @romainfieve/finite-state-machine

or

npm install @romainfieve/finite-state-machine

Usage

const isAdult = (age?: number) => !!age && age >= 18

enum States {
    Age = 'age',
    FirstName = 'firstName',
    IsAllowed = 'isAllowed',
    LastName = 'lastName',
}

type Data = {
    age?: number
    firstName?: string
    isAllowed?: boolean
    lastName?: string
}

const transitions: Transitions<States, Data> = {
    age: (data) => (isAdult(data.age) ? States.FirstName : States.IsAllowed),
    isAllowed: (data) => (data.isAllowed ? States.FirstName : undefined),
    firstName: (_data) => States.LastName,
    lastName: (_data) => undefined,
}

const converters: Converters<States, Data> = {
    age: (age: number, _data) => ({ isAllowed: isAdult(age), age }),
    isAllowed: (isAllowed: boolean, _data) => ({ isAllowed }),
    firstName: (firstName: string, _data) => ({ firstName }),
    lastName: (lastName: string, _data) => ({ lastName }),
}

const fsm = new FiniteStateMachine({
    initialState: States.Age,
    initialData: {},
    transitions,
    converters,
})
    .set(18)
    .set('John')
    .set('Doe')

const state = fsm.state // 'lastName'
const data = fsm.data // { lastName: 'Doe', firstName: 'John', age: 18, isAllowed: true }

Package Sidebar

Install

npm i @romainfieve/finite-state-machine

Weekly Downloads

1

Version

0.0.11

License

MIT

Unpacked Size

39 kB

Total Files

9

Last publish

Collaborators

  • romainfieve