import type { Point } from "@ue-too/math";
import { CameraMux } from "../../camera/camera-mux";
import { ObservableBoardCamera } from "../../camera/interface";
/**
 * @description The unsubscribe to user raw input.
 *
 * @category Event Parser
 */
export type UnsubscribeToUserRawInput = () => void;
/**
 * @description The raw user pan input event payload.
 *
 * @category Event Parser
 */
export type RawUserPanInputEventPayload = {
    diff: Point;
};
/**
 * @description The raw user pan input event.
 * Use type to discriminate between pan, zoom, and rotate events.
 *
 * @category Event Parser
 */
export type RawUserPanInputEvent = {
    type: "pan";
} & RawUserPanInputEventPayload;
/**
 * @description The raw user zoom input event payload.
 *
 * @category Event Parser
 */
export type RawUserZoomInputEventPayload = {
    deltaZoomAmount: number;
    anchorPoint: Point;
};
/**
 * @description The raw user zoom input event.
 * Use type to discriminate between pan, zoom, and rotate events.
 *
 * @category Event Parser
 */
export type RawUserZoomInputEvent = {
    type: "zoom";
} & RawUserZoomInputEventPayload;
/**
 * @description The raw user rotate input event payload.
 *
 * @category Event Parser
 */
export type RawUserRotateInputEventPayload = {
    deltaRotation: number;
};
/**
 * @description The raw user rotate input event.
 * Use type to discriminate between pan, zoom, and rotate events.
 *
 * @category Event Parser
 */
export type RawUserRotateInputEvent = {
    type: "rotate";
} & RawUserRotateInputEventPayload;
/**
 * @description The raw user input event map.
 *
 * @category Event Parser
 */
export type RawUserInputEventMap = {
    "pan": RawUserPanInputEventPayload;
    "zoom": RawUserZoomInputEventPayload;
    "rotate": RawUserRotateInputEventPayload;
    "all": RawUserInputEvent;
};
/**
 * @description The raw user input event.
 * Use type to discriminate between pan, zoom, and rotate events.
 *
 * @category Event Parser
 */
export type RawUserInputEvent = RawUserPanInputEvent | RawUserZoomInputEvent | RawUserRotateInputEvent;
/**
 * @description The raw user input callback.
 * This is the function type of callbacks for raw user input events.
 *
 * @category Event Parser
 */
export type RawUserInputCallback<K extends keyof RawUserInputEventMap> = (event: RawUserInputEventMap[K]) => void;
export interface UserInputPublisher {
    notifyPan(diff: Point): void;
    notifyZoom(deltaZoomAmount: number, anchorPoint: Point): void;
    notifyRotate(deltaRotation: number): void;
    on<K extends keyof RawUserInputEventMap>(eventName: K, callback: (event: RawUserInputEventMap[K]) => void): UnsubscribeToUserRawInput;
}
/**
 * @description The raw user input publisher.
 * Publishs raw user input events to the input flow control, and subscribers.
 *
 * @category Event Parser
 */
export declare class RawUserInputPublisher implements UserInputPublisher {
    private pan;
    private zoom;
    private rotate;
    private all;
    private _cameraMux;
    constructor(cameraMux: CameraMux);
    notifyPan(diff: Point): void;
    notifyZoom(deltaZoomAmount: number, anchorPoint: Point): void;
    notifyRotate(deltaRotation: number): void;
    on<K extends keyof RawUserInputEventMap>(eventName: K, callback: (event: RawUserInputEventMap[K]) => void): UnsubscribeToUserRawInput;
    get cameraMux(): CameraMux;
    set cameraMux(cameraMux: CameraMux);
}
/**
 * @description Creates a default raw user input publisher.
 *
 * @category Event Parser
 */
export declare function createDefaultRawUserInputPublisher(camera: ObservableBoardCamera): RawUserInputPublisher;
export declare class RawUserInputPublisherWithWebWorkerRelay implements UserInputPublisher {
    private pan;
    private zoom;
    private rotate;
    private all;
    private webWorker;
    constructor(webWorker: Worker);
    notifyPan(diff: Point): void;
    notifyZoom(deltaZoomAmount: number, anchorPoint: Point): void;
    notifyRotate(deltaRotation: number): void;
    on<K extends keyof RawUserInputEventMap>(eventName: K, callback: (event: RawUserInputEventMap[K]) => void): UnsubscribeToUserRawInput;
}
