The library supports both OOP and FP.
npm install extra-fsmsh
npm install --save extra-fsm
or
yarn add extra-fsm
`$3
`ts
import { FiniteStateMachine, transition } from 'extra-fsm'const schema = {
stopped: { start: 'running' }
, running: { stop: 'stopped' }
}
// OOP
const fsm = new FiniteStateMachine(schema, 'stopped')
fsm.send('start')
console.log(fsm.state) // running
// FP
const newState = transition(schema, 'stopped', 'start')
console.log(newState)// running
`API
`ts
type IFiniteStateMachineSchema<
State extends string | number | symbol
, Event extends string | number | symbol
> = Record>>
`$3
`ts
class FiniteStateMachine<
State extends string | number | symbol
, Event extends string | number | symbol
> {
get [Symbol.toStringTag](): string
get state(): State constructor(
schema: IFiniteStateMachineSchema
, initialState: State
)
matches(state: State): boolean
can(event: Event): boolean
/**
* @throws {BadEventError}
*/
send(event: Event): void
}
`$3
`ts
interface IFiniteStateMachineStateChange<
State extends string | number | symbol
, Event extends string | number | symbol
> {
event: Event
oldState: State
newState: State
}class ObservableFiniteStateMachine<
State extends string | number | symbol
, Event extends string | number | symbol
> extends FiniteStateMachine {
get [Symbol.toStringTag](): string
observeStateChanges(): Observable>
}
`$3
`ts
export function transition<
State extends string | number | symbol
, Event extends string | number | symbol
, TransitionEvent extends Event
>(
schema: IFiniteStateMachineSchema
, state: State
, event: TransitionEvent
): State
`$3
`ts
function canTransition<
State extends string | number | symbol
, Event extends string | number | symbol
>(
schema: IFiniteStateMachineSchema
, state: State
, event: Event
) => boolean
``