UNPKG

overmind

Version:
65 lines (64 loc) 3.2 kB
import { IState } from '.'; type TState = { current: string; } & TBaseState; type TBaseState = { [key: string]: IState | Statemachine<any, any, any>; }; type TEvents = { type: string; data?: any; }; export type StatemachineTransitions<States extends TState, Events extends TEvents, BaseState extends TBaseState> = ([BaseState] extends [never] ? (event: Events, state: States) => States | void : (event: Events, state: States & BaseState) => States | void) | { [State in States['current']]: { [Type in Events['type']]?: [BaseState] extends [never] ? ((event: Events extends { type: Type; } ? Events['data'] : never, state: States extends { current: State; } ? States : never) => States | void) : ((event: Events extends { type: Type; } ? Events['data'] : never, state: States extends { current: State; } ? States & BaseState : never) => States | void); }; }; export interface MachineMethods<States extends TState, Events extends TEvents, BaseState extends TBaseState> { matches<T extends States['current']>(current: T): Statemachine<States extends { current: T; } ? States : never, Events, BaseState> | undefined; send<T extends Events['type']>(...args: Events extends { type: T; data: any; } ? [T, Events['data']] : [T]): Statemachine<States, Events, BaseState>; onTransition(listener: (state: States) => void): void; } export type Statemachine<States extends TState, Events extends TEvents, BaseState extends TBaseState = never> = [BaseState] extends [never] ? States & MachineMethods<States, Events, BaseState> : States & BaseState & MachineMethods<States, Events, BaseState>; declare const INITIAL_STATE: unique symbol; declare const TRANSITIONS: unique symbol; declare const STATE: unique symbol; declare const IS_DISPOSED: unique symbol; declare const BASE_STATE: unique symbol; declare const TRANSITION_LISTENERS: unique symbol; export declare function deepCopy(obj: any): any; export declare class StateMachine<State extends TState, Events extends TEvents, BaseState extends TBaseState> { current: State['current']; private [INITIAL_STATE]; private [TRANSITIONS]; private [STATE]; private [BASE_STATE]; private [TRANSITION_LISTENERS]; private [IS_DISPOSED]; private clone; private dispose; constructor(transitions: StatemachineTransitions<State, Events, BaseState>, state: State, baseState: BaseState); send(type: any, data: any): this; matches(state: any): this | undefined; onTransition(listener: (state: State) => void): void; } export type StatemachineFactory<States extends TState, Events extends TEvents, BaseState extends TBaseState> = [BaseState] extends [never] ? { create(state: States): Statemachine<States, Events, {}>; } : { create(state: States, baseState: BaseState): Statemachine<States, Events, BaseState>; }; export declare function statemachine<States extends TState, Events extends TEvents, BaseState extends TBaseState = never>(transitions: StatemachineTransitions<States, Events, BaseState>): StatemachineFactory<States, Events, BaseState>; export {};