chore: expose all types, utils and symbols

This commit is contained in:
Dmitriy Pleshevskiy 2021-08-23 11:40:31 +03:00
parent 9d14ed5e84
commit 269291af04

44
fsm.ts
View file

@ -1,23 +1,23 @@
type StateTransitions<Ctx, SN extends string> = WeakMap< export type StateTransitions<Ctx, SN extends string> = WeakMap<
State<Ctx, SN>, State<Ctx, SN>,
WeakSet<State<Ctx, SN>> WeakSet<State<Ctx, SN>>
>; >;
type StateOrName<Ctx, SN extends string> = export type StateOrName<Ctx, SN extends string> =
| State<Ctx, SN> | State<Ctx, SN>
| SN; | SN;
type SourceTransitions<SN extends string> = Array<[SN, Array<SN>]>; export type SourceTransitions<SN extends string> = Array<[SN, Array<SN>]>;
type SourceNamedTransitions<SN extends string> = Array< export type SourceNamedTransitions<SN extends string> = Array<
[SN, Record<string, SN>] [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"); export const _states = Symbol("states");
const _transitions = Symbol("transitions"); export const _transitions = Symbol("transitions");
const _actions = Symbol("actions"); export const _actions = Symbol("actions");
const _prevState = Symbol("previous state"); export const _prevState = Symbol("previous state");
const _currState = Symbol("current state"); export const _currState = Symbol("current state");
export class StateMachineBuilder<Ctx, SN extends string = string> { export class StateMachineBuilder<Ctx, SN extends string = string> {
[_states]: Map<SN, Events<Ctx, SN>>; [_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>; transitions?: StateTransitions<Ctx, SN>;
actions?: Actions<Ctx, SN>; actions?: Actions<Ctx, SN>;
} }
type Actions<Ctx, SN extends string> = Map< export type Actions<Ctx, SN extends string> = Map<
string, string,
Array<[State<Ctx, SN>, State<Ctx, SN>]> Array<[State<Ctx, SN>, State<Ctx, SN>]>
>; >;
@ -219,10 +219,10 @@ export class StateMachine<Ctx, SN extends string = string> {
} }
} }
const _stateName = Symbol("state name"); export const _stateName = Symbol("state name");
const _stateEvents = Symbol("state events"); export const _stateEvents = Symbol("state events");
interface Events<Ctx, SN extends string> { export interface Events<Ctx, SN extends string> {
beforeExit?( beforeExit?(
fromState: State<Ctx, SN>, fromState: State<Ctx, SN>,
toState: 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>[], states: State<Ctx, SN>[],
state: StateOrName<Ctx, SN>, state: StateOrName<Ctx, SN>,
) { ) {
return validState<Ctx, SN>(normalizeState(states, state)); return validState<Ctx, SN>(normalizeState(states, state));
} }
function normalizeState<Ctx, SN extends string>( export function normalizeState<Ctx, SN extends string>(
states: State<Ctx, SN>[], states: State<Ctx, SN>[],
state: StateOrName<Ctx, SN>, state: StateOrName<Ctx, SN>,
): State<Ctx, SN> | undefined { ): State<Ctx, SN> | undefined {
return isStr(state) ? stateFromName(states, state) : state; return isStr(state) ? stateFromName(states, state) : state;
} }
function validStateFromName<Ctx, SN extends string>( export function validStateFromName<Ctx, SN extends string>(
states: State<Ctx, SN>[], states: State<Ctx, SN>[],
name: SN, name: SN,
) { ) {
return validState<Ctx, SN>(stateFromName(states, name)); return validState<Ctx, SN>(stateFromName(states, name));
} }
function stateFromName<Ctx, SN extends string>( export function stateFromName<Ctx, SN extends string>(
states: State<Ctx, SN>[], states: State<Ctx, SN>[],
name: SN, name: SN,
) { ) {
return states.find((state) => state.name === name); 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)) { if (!isState<Ctx, SN>(val)) {
throw new TypeError("an instance of State class is expected"); throw new TypeError("an instance of State class is expected");
} }
return val; 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; return val instanceof State;
} }