import { IObservable } from '@vkontakte/videoplayer-shared';
export interface IStateMachine<TState> {
    /**
     * Событие о начале перехода между состояниями
     */
    transitionStarted$: IObservable<ITransition<TState>>;
    /**
     * Событие об изменении целевого состояния в процессе осуществления перехода
     */
    transitionUpdated$: IObservable<ITransition<TState>>;
    /**
     * Событие об окончании перехода между состояниями
     */
    transitionEnded$: IObservable<ITransition<TState>>;
    /**
     * Событие о переходе в состояние, transition в которое не начинался
     */
    forceChanged$: IObservable<ITransition<TState>>;
    /**
     * Приозводное от `transitionStarted$` и `transitionUpdated$` событие.
     */
    stateChangeStarted$: IObservable<ITransition<TState>>;
    /**
     * Приозводное от `transitionEnded$` и `forceChanged$` событие.
     */
    stateChangeEnded$: IObservable<ITransition<TState>>;
    /**
     * Начало перехода в состояние.
     * Если в этот момент не было активного transition - будет отправлено событие `transitionStarted$`,
     * иначе - `transitionUpdated$`
     */
    startTransitionTo(state: TState): void;
    /**
     * Окончание перехода в состояние.
     * Если transition в это состояние был начат - будет отправлено событие `transitionEnded$`,
     * иначе - `forceChanged$`
     */
    setState(state: TState): void;
    /**
     * Возвращает текущее состояние.
     * Если сейчас есть активный transition - будет возвращено состояние, transition в которое сейчас выполняется (оптимистичноая стратегия изменений)
     */
    getState(): TState;
    /**
     * Возвращает предыдущее состояние.
     */
    getPrevState(): TState | undefined;
    /**
     * Возвращает текущий transition (если есть). Иначе - `undefined`
     */
    getTransition(): ITransition<TState> | undefined;
}
export interface ITransition<TState> {
    from: TState;
    to: TState;
    /**
     * Информация о том, что переход был осуществлён с прерыванием другого перехода
     */
    canceledTransition?: ITransition<TState>;
}
