/**
 * EventEmitter
 *
 * This is a tiny event emitter meant to be used at several components that relay on each other to sync data in parallel.
 *
 * - In your class: this._emitterInstance = EventEmitter.createInstance(id) // unique id
 * - Listen to changes: this._emitterInstance.listen(function)
 * - Set new data: this._emitterInstance.set({...})
 * - Update new data: this._emitterInstance.update({...})
 * - Get new data: this._emitterInstance.get()
 * - Remove it like this: this._emitterInstance.remove()
 *
 * __EEE__ stands for __EUFEMIA_EVENT_EMITTER__
 */
declare global {
    interface Window {
        __EEE__?: EventEmitterEEE;
    }
}
export type EventEmitterId = string;
export type EventEmitterData = Record<string, unknown>;
export type EventEmitterListener = (data: EventEmitterData) => void;
export type EventEmitterEEE = Record<EventEmitterId, EventEmitterScopeObject>;
export type EventEmitterScope = ({
    __EEE__?: EventEmitterEEE;
} & Window) | EventEmitter;
export type EventEmitterScopeInstances = Array<EventEmitter>;
export type EventEmitterScopeObject = {
    count: number;
    instances: EventEmitterScopeInstances;
    data: EventEmitterData;
};
/**
 * Deprecated
 *
 * @deprecated Please use useSharedState instead for new code
 */
declare class EventEmitter {
    static createInstance(id: EventEmitterId): EventEmitter;
    static __EEE__?: Record<EventEmitterId, EventEmitterScopeObject>;
    id: EventEmitterId;
    listeners: Array<EventEmitterListener>;
    constructor(id: EventEmitterId);
    update: (data: EventEmitterData) => void;
    set: (data: EventEmitterData) => void;
    get: () => EventEmitterData;
    listen(fn: EventEmitterListener): this;
    unlisten(fn?: EventEmitterListener | undefined): void;
    remove(): void;
}
export default EventEmitter;
