export interface EventInterface<T> {
    emit: (arg: T) => void;
    removeAllListeners: () => void;
    add: (callback: (args: T) => void) => {
        removeListener: () => void;
        disposer: (disposer: EventDisposerInterface) => void;
    };
    once: (callback: (arg: T) => void) => {
        removeListener: () => void;
        disposer: (disposer: EventDisposerInterface) => void;
    };
    asPromise: (timeLimit?: number) => Promise<T>;
    watch: (callback: (arg: T) => boolean | undefined | null, timeLimit?: number) => Promise<T>;
}
interface PrivateEventInterface<T> extends EventInterface<T> {
    asPromise: (timeLimit?: number, disposer?: PrivateEventDisposerInterface) => Promise<T>;
    watch: (callback: (arg: T) => boolean | undefined | null, timeLimit?: number, disposer?: PrivateEventDisposerInterface) => Promise<T>;
}
export declare class Event<T> implements PrivateEventInterface<T> {
    private _onSetListener;
    private _stack;
    private _eventIndex;
    /**@internal */
    constructor(_onSetListener?: () => void);
    /**@internal */
    emit: (arg: T) => void;
    /**@internal */
    removeAllListeners: () => void;
    /**@internal */
    pipe: (event: Event<T>) => {
        removeListener: () => void;
        disposer: (disposer: EventDisposerInterface) => void;
    };
    /**
     * イベントが起きた時に実行する関数を登録する。
     * 戻り値として関数の登録を解除する関数が帰ってくる
     */
    add: (callback: (args: T) => void) => {
        removeListener: () => void;
        disposer: (disposer: EventDisposerInterface) => void;
    };
    /**イベントが起きた時に一度だけ実行される関数を登録する */
    once: (callback: (arg: T) => void) => {
        removeListener: () => void;
        disposer: (disposer: EventDisposerInterface) => void;
    };
    /**
     * イベントが起きた時に Promise が resolve される
     * @param timeLimit ms
     */
    asPromise: (timeLimit?: number, disposer?: PrivateEventDisposerInterface) => Promise<T>;
    /**
     * イベントが起きた時に実行される boolean を返す関数を登録する。
     * 登録した関数が true を返した時に Promise が resolve される
     * */
    watch: (callback: (arg: T) => boolean | undefined | null, timeLimit?: number, disposer?: PrivateEventDisposerInterface) => Promise<T>;
    /**@internal */
    get length(): number;
}
/**@internal */
export declare class Events {
    events: Event<any>[];
    make<T>(): Event<T>;
    dispose(): void;
}
/**@internal */
export interface EventDisposerInterface {
    push: (disposer: () => void) => void;
    dispose: () => void;
}
interface PrivateEventDisposerInterface extends EventDisposerInterface {
    remove: (disposer: () => void) => void;
}
/**@internal */
export declare class EventDisposer implements PrivateEventDisposerInterface {
    private _disposer;
    push(disposer: () => void): void;
    remove(disposer: () => void): void;
    dispose(): void;
}
export {};
//# sourceMappingURL=event.d.ts.map