import type { AbstractMap, AbstractMapEventMap } from '../components';
import { type Tg } from './event';
import { type CoordTypeSupplier } from './lat-lng';
import type { UnionBaiduEventTarget, UnionGoogleEventTarget } from './unions';
/**
 * 移除事件监听的函数
 *
 * 实现{@link EventTarget}有点复杂, 对于简单的情况, 实现一个设置监听的函数+返回{@link RemoveEventListenerFunction}就够了
 * @see addBaiduEventListener
 * @see addGoogleEventListener
 * */
export interface RemoveEventListenerFunction {
    (): void;
}
export declare function addGoogleEventListener(target: UnionGoogleEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction;
export declare function addBaiduEventListener(target: UnionBaiduEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction;
export declare function addHtmlEventListener<K extends keyof EventMap, EventMap = HTMLElementEventMap, T extends EventTarget = HTMLElement>(target: T, type: K, listener: (this: T, ev: EventMap[K]) => any, options?: AddEventListenerOptions | boolean): RemoveEventListenerFunction;
export declare function addTgEventListener<K extends keyof EventMap, EventMap = AbstractMapEventMap, T extends Tg.EventTarget = AbstractMap>(target: T, type: K, listener: (this: T, ev: EventMap[K]) => any): RemoveEventListenerFunction;
export interface EventTargetDelegate extends Tg.EventTarget {
    setTarget(target: Tg.EventTarget): this;
}
/**
 * ## Delegate(代理) VS Mixin(混合)
 * Delegate相对于Mixin的优点是调用路径更明确, 缺点是js/ts原生不支持, 需要写样板代码
 */
export declare abstract class AbstractEventTargetDelegate<T = any> implements EventTargetDelegate {
    protected inner: T;
    protected coordTypeSupplier: CoordTypeSupplier;
    protected eventMap: Map<string, any>;
    protected target: Tg.EventTarget;
    constructor(inner: T, coordTypeSupplier: CoordTypeSupplier);
    setTarget(target: Tg.EventTarget): this;
    abstract addEventListener(type: string, listener: Tg.EventListener): void;
    abstract removeEventListener(type: string, listener: Tg.EventListener): void;
}
export declare class EventHubEventTargetDelegate<EventTypes extends string = string> implements EventTargetDelegate {
    private delegate;
    private options;
    private eventHub;
    constructor(delegate: EventTargetDelegate, options: {
        /** 由{@link eventHub}手动处理的事件 */
        types: EventTypes[];
        /** 用户开始监听{@link type} */
        onListen: (type: EventTypes) => void;
        /** 用户结束监听{@link type} */
        onCancel: (type: EventTypes) => void;
    });
    notify(event: Tg.Event): void;
    hasListener(type: EventTypes): boolean;
    setTarget(target: Tg.EventTarget): this;
    addEventListener(type: string, listener: Tg.EventListener): void;
    removeEventListener(type: string, listener: Tg.EventListener): void;
}
export declare class GoogleEventTargetDelegate<T extends UnionGoogleEventTarget = UnionGoogleEventTarget> extends AbstractEventTargetDelegate<T> {
    private static EVENT_TYPE_MAP;
    addEventListener(type: string, listener: Tg.EventListener): void;
    removeEventListener(type: string, listener: Tg.EventListener): void;
}
export declare class BaiduEventTargetDelegate<T extends UnionBaiduEventTarget = UnionBaiduEventTarget> extends AbstractEventTargetDelegate<T> {
    private static EVENT_TYPE_MAP;
    addEventListener(type: string, listener: Tg.EventListener): void;
    removeEventListener(type: string, listener: Tg.EventListener): void;
}
/** 手动维护事件 */
export declare class EventHub implements Tg.EventTarget {
    private typeMap;
    addEventListener(type: string, listener: Tg.EventListener): void;
    removeEventListener(type: string, listener: Tg.EventListener): void;
    hasListener(type: string): boolean;
    notify(event: Tg.Event): void;
}
