import { EventBase, EventClass } from "./EventClass";
interface EHistoryEventData {
    /**
     * Current index
     */
    index: number;
}
interface EHistoryNavigateEventData extends EHistoryEventData {
    /**
     * Delta
     */
    delta: number;
}
type EHistoryEventDef = {
    clear: EHistoryEventData;
    navigate: EHistoryNavigateEventData;
    push: EHistoryEventData;
    replace: EHistoryEventData;
};
type EHistoryEventType = Exclude<keyof EHistoryEventDef, "navigate">;
/**
 * ETSOO Extended history event
 */
export declare class EHistoryEvent extends EventBase<EHistoryEventType, EHistoryEventData> {
}
/**
 * ETSOO Extended history navigate event
 */
export declare class EHistoryNavigateEvent extends EventBase<"navigate", EHistoryNavigateEventData> {
    constructor(target: {}, data: EHistoryNavigateEventData);
}
/**
 * ETSOO Extended abstract history class
 */
export declare abstract class EHistory<T> extends EventClass<EHistoryEventDef> {
    readonly maxDepth: number;
    private _index;
    /**
     * States
     */
    readonly states: T[];
    /**
     * States length
     */
    get length(): number;
    /**
     * Get current state index
     */
    get index(): number;
    /**
     * Get current state
     */
    get state(): T | undefined;
    /**
     * Constructor
     * @param maxDepth Max depth of the history
     */
    constructor(maxDepth?: number);
    /**
     * Back to the previous state
     */
    back(): void;
    /**
     * Clear all states but keep event listeners
     */
    clear(): void;
    /**
     * Create event
     * @param type Type
     * @param index Current index
     */
    protected createEvent<T extends EHistoryEventType>(type: T, index: number): EHistoryEvent;
    protected createNavigateEvent(index: number, delta: number): EHistoryNavigateEvent;
    /**
     * Forward to the next state
     */
    forward(): void;
    /**
     * Get [undo, redo] status
     */
    getStatus(): [boolean, boolean];
    /**
     * Go to the specific state
     * @param delta A negative value moves backwards, a positive value moves forwards
     */
    go(delta: number): undefined;
    /**
     * Adds an entry to the history stack
     * @param state State
     */
    pushState(state: T): void;
    /**
     * Modifies the current history entry
     * @param state State
     */
    replaceState(state: T): void;
}
export {};
