import { ECollectType } from '../const/enums';
import { KeyPathType } from '../core/domain';
import { MaterialCallStackRecord } from './materialCallStack';
export declare enum EEventName {
    storeOnActive = "storeOnActive",
    beforeStoreChange = "beforeStoreChange",
    afterStoreChange = "afterStoreChange",
    asyncAfterStoreChange = "asyncAfterStoreChange",
    setProperty = "setProperty",
    materialCallStackChange = "materialCallStackChange"
}
export interface SetPropertyEvent {
    stackId?: number;
    domain: string;
    keyPath: Array<{
        type: KeyPathType;
        value: string;
    }>;
    newValue: any;
    oldValue: any;
    time: number;
    type: ECollectType;
}
export interface BeforeStoreChangeEvent {
    domain?: string;
    method: string;
    args: any[];
    state: any;
    time: number;
    stackId?: number;
}
export interface AfterStoreChangeEvent {
    domain?: string;
    method: string;
    args: any[];
    state: any;
    async: boolean;
    time: number;
    stackId?: number;
}
export interface MaterialCallStackChangeEvent {
    stack: MaterialCallStackRecord[];
    action: 'POP' | 'PUSH';
    time: number;
    currentStack?: MaterialCallStackRecord;
}
declare class Emitter {
    private listeners;
    on(eventName: EEventName.storeOnActive, callback: () => void): void;
    on(eventName: EEventName.setProperty, callback: (event: SetPropertyEvent) => void): void;
    on(eventName: EEventName.beforeStoreChange, callback: (event: BeforeStoreChangeEvent) => void): void;
    on(eventName: EEventName.afterStoreChange, callback: (event: AfterStoreChangeEvent) => void): void;
    on(eventName: EEventName.asyncAfterStoreChange, callback: (event: AfterStoreChangeEvent) => void): void;
    on(eventName: EEventName.materialCallStackChange, callback: (event: MaterialCallStackChangeEvent) => void): void;
    emit(eventName: EEventName.storeOnActive): void;
    emit(eventName: EEventName.setProperty, args: SetPropertyEvent): void;
    emit(eventName: EEventName.beforeStoreChange, args: BeforeStoreChangeEvent): void;
    emit(eventName: EEventName.afterStoreChange, args: AfterStoreChangeEvent): void;
    emit(eventName: EEventName.asyncAfterStoreChange, args: AfterStoreChangeEvent): void;
    emit(eventName: EEventName.materialCallStackChange, args: MaterialCallStackChangeEvent): void;
    off(eventName: EEventName): void;
}
export declare const emitter: Emitter;
export {};
