import { EventsType } from './common';
/**
 * A simple event emitter interface used to implement the observer pattern throughout the codebase.
 *
 * @public
 *
 */
export interface Emitter<E extends EventsType> {
    /**
     * Add a listener to a specific event.
     *
     * @param eventName - The name of the event
     * @param listener - A listener function that takes as parameter the payload of the event
     */
    addEventListener<K extends keyof E>(eventName: K, listener: (data: E[K]) => void): void;
    /**
     * Remove a listener from a specific event.
     *
     * @param eventName - The name of the event
     * @param listener - A listener function that had been added previously
     */
    removeEventListener<K extends keyof E>(eventName: K, listener: (data: E[K]) => void): void;
    /**
     * Add a listener to a specific event, that will only be invoked once
     *
     * @remarks
     *
     * After the first occurrence of the specified event, the listener will be invoked and
     * immediately removed.
     *
     * @param eventName - The name of the event
     * @param listener - A listener function that had been added previously
     */
    once<K extends keyof E>(eventName: K): Promise<E[K]>;
}
/**
 * A concrete implementation of the {@link Emitter} interface
 *
 * @public
 */
export declare class ConcreteEmitter<E extends EventsType> implements Emitter<E> {
    private _listeners;
    constructor();
    /** {@inheritDoc Emitter.addEventListener} */
    addEventListener<K extends keyof E>(eventName: K, listener: (data: E[K]) => void): void;
    /** {@inheritDoc Emitter.removeEventListener} */
    removeEventListener<K extends keyof E>(eventName: K, listener: (data: E[K]) => void): void;
    /** {@inheritDoc Emitter.once} */
    once<K extends keyof E>(eventName: K): Promise<E[K]>;
    /** @internal */
    protected emit<K extends keyof E>(eventName: K, data: E[K]): void;
    /** @internal */
    protected removeAllListeners(): void;
}
