import type { EventInterface } from "../event/event";
declare type EventObserverType = <SubjectInterface, DataType>(event: EventInterface<SubjectInterface, DataType>) => void;
interface ObserverCollectionInterface {
    [eventName: string]: Array<EventObserverType>;
}
declare abstract class AbstractEventEmitter<SubjectInterface, DataType> {
    abstract readonly subject: SubjectInterface;
    abstract readonly events: Array<string>;
    protected abstract observers: ObserverCollectionInterface;
    abstract eventIsRegistered(eventName: string): boolean;
    abstract addObserver(eventName: string, observer: EventObserverType): void;
    abstract removeObserver(eventName: string, observer: EventObserverType): void;
    protected abstract notifyObservers(eventName: string, data?: DataType): void;
    abstract emit(eventName: string, data?: DataType): void;
}
declare class EventEmitter<SubjectInterface, DataType> extends AbstractEventEmitter<SubjectInterface, DataType> {
    readonly subject: SubjectInterface;
    readonly events: Array<string>;
    protected observers: ObserverCollectionInterface;
    constructor(subject: SubjectInterface, events: Array<string>);
    eventIsRegistered(eventName: string): boolean;
    addObserver(eventName: string, observer: EventObserverType): void;
    removeObserver(eventName: string, observer: EventObserverType): void;
    protected notifyObservers(eventName: string, data?: DataType): void;
    emit(eventName: string, data?: DataType): void;
}
export default EventEmitter;
export type { AbstractEventEmitter, EventObserverType };
