import { IState } from "./types.js";

//#region src/statemachine.d.ts
type TState = {
  current: string;
} & TBaseState;
type TBaseState = {
  [key: string]: IState | Statemachine<any, any, any>;
};
type TEvents = {
  type: string;
  data?: any;
};
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 } };
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;
}
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>;
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>;
};
declare function statemachine<States extends TState, Events extends TEvents, BaseState extends TBaseState = never>(transitions: StatemachineTransitions<States, Events, BaseState>): StatemachineFactory<States, Events, BaseState>;
//#endregion
export { MachineMethods, Statemachine, statemachine };
//# sourceMappingURL=statemachine.d.ts.map