import { EventEmitter2 as EventEmitter } from "eventemitter2";
import { BusEvent, EventCreatorFn } from "./types";
export declare type PredicateFn<T> = (event: T) => boolean;
declare type TestPredicateFn<P> = (payload: P) => boolean;
declare type EventDefinitionOptions<P> = {
    test?: (payload: P) => boolean;
};
export declare function createEventDefinition<P = void>(options?: EventDefinitionOptions<P> | TestPredicateFn<P>): <T extends string>(type: T) => {
    (payload: P): {
        type: T;
        payload: P;
    };
    eventType: T;
    toString(): T;
};
export declare function defineEvent<T extends BusEvent>(type: T["type"]): EventCreatorFn<T>;
export declare class EventBus {
    emitter: EventEmitter;
    publish<T extends BusEvent>(event: T, meta?: any): void;
    subscribe<T extends BusEvent>(subscription: string, handler: (e: BusEvent) => void): () => void;
    subscribe<T extends BusEvent>(subscription: EventCreatorFn<T>, handler: (e: ReturnType<typeof subscription>) => void): () => void;
    subscribe<T extends BusEvent>(subscription: PredicateFn<T>, handler: (e: T) => void): () => void;
    subscribe<T extends {
        type: string;
    }>(subscription: T["type"], handler: (e: T) => void): () => void;
}
export {};
