From 269291af041214c35bf2fb6eb3206b187801944a Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy <dmitriy@ideascup.me> Date: Mon, 23 Aug 2021 11:40:31 +0300 Subject: [PATCH] chore: expose all types, utils and symbols --- fsm.ts | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/fsm.ts b/fsm.ts index 6ec3e32..a8e1ed4 100644 --- a/fsm.ts +++ b/fsm.ts @@ -1,23 +1,23 @@ -type StateTransitions<Ctx, SN extends string> = WeakMap< +export type StateTransitions<Ctx, SN extends string> = WeakMap< State<Ctx, SN>, WeakSet<State<Ctx, SN>> >; -type StateOrName<Ctx, SN extends string> = +export type StateOrName<Ctx, SN extends string> = | State<Ctx, SN> | SN; -type SourceTransitions<SN extends string> = Array<[SN, Array<SN>]>; -type SourceNamedTransitions<SN extends string> = Array< +export type SourceTransitions<SN extends string> = Array<[SN, Array<SN>]>; +export type SourceNamedTransitions<SN extends string> = Array< [SN, Record<string, SN>] >; -type SourceActions<SN extends string> = Record<string, Array<[SN, SN]>>; +export type SourceActions<SN extends string> = Record<string, Array<[SN, SN]>>; export const _states = Symbol("states"); -const _transitions = Symbol("transitions"); -const _actions = Symbol("actions"); -const _prevState = Symbol("previous state"); -const _currState = Symbol("current state"); +export const _transitions = Symbol("transitions"); +export const _actions = Symbol("actions"); +export const _prevState = Symbol("previous state"); +export const _currState = Symbol("current state"); export class StateMachineBuilder<Ctx, SN extends string = string> { [_states]: Map<SN, Events<Ctx, SN>>; @@ -123,12 +123,12 @@ export class StateMachineBuilder<Ctx, SN extends string = string> { } } -interface StateMachineOpts<Ctx, SN extends string> { +export interface StateMachineOpts<Ctx, SN extends string> { transitions?: StateTransitions<Ctx, SN>; actions?: Actions<Ctx, SN>; } -type Actions<Ctx, SN extends string> = Map< +export type Actions<Ctx, SN extends string> = Map< string, Array<[State<Ctx, SN>, State<Ctx, SN>]> >; @@ -219,10 +219,10 @@ export class StateMachine<Ctx, SN extends string = string> { } } -const _stateName = Symbol("state name"); -const _stateEvents = Symbol("state events"); +export const _stateName = Symbol("state name"); +export const _stateEvents = Symbol("state events"); -interface Events<Ctx, SN extends string> { +export interface Events<Ctx, SN extends string> { beforeExit?( fromState: State<Ctx, SN>, toState: State<Ctx, SN>, @@ -274,42 +274,46 @@ export class State<Ctx, SN extends string = string> { } } -function validNormalizedState<Ctx, SN extends string>( +export function validNormalizedState<Ctx, SN extends string>( states: State<Ctx, SN>[], state: StateOrName<Ctx, SN>, ) { return validState<Ctx, SN>(normalizeState(states, state)); } -function normalizeState<Ctx, SN extends string>( +export function normalizeState<Ctx, SN extends string>( states: State<Ctx, SN>[], state: StateOrName<Ctx, SN>, ): State<Ctx, SN> | undefined { return isStr(state) ? stateFromName(states, state) : state; } -function validStateFromName<Ctx, SN extends string>( +export function validStateFromName<Ctx, SN extends string>( states: State<Ctx, SN>[], name: SN, ) { return validState<Ctx, SN>(stateFromName(states, name)); } -function stateFromName<Ctx, SN extends string>( +export function stateFromName<Ctx, SN extends string>( states: State<Ctx, SN>[], name: SN, ) { return states.find((state) => state.name === name); } -function validState<Ctx, SN extends string>(val: unknown): State<Ctx, SN> { +export function validState<Ctx, SN extends string>( + val: unknown, +): State<Ctx, SN> { if (!isState<Ctx, SN>(val)) { throw new TypeError("an instance of State class is expected"); } return val; } -function isState<Ctx, SN extends string>(val: unknown): val is State<Ctx, SN> { +export function isState<Ctx, SN extends string>( + val: unknown, +): val is State<Ctx, SN> { return val instanceof State; }