import { Observer, SubscriptionOptions } from "../../utils/observable";
export type Position = {
    x: number;
    y: number;
};
export type Velocity = {
    vx: number;
    vy: number;
};
export type DestinationUpdate = Position & {
    type: 'destination';
};
export type DeltaUpdate = Position & {
    type: 'delta';
};
export type PositionUpdate = DestinationUpdate | DeltaUpdate;
export declare class CameraPositionUpdateBatcher {
    private nextPosition;
    private delta;
    private observable;
    private queuePositionUpdateCount;
    private queuePositionUpdateToCount;
    private queuePositionUpdateByCount;
    private lastUpdateCount;
    constructor();
    /**
     * Queue an absolute position update to be processed in the next animation frame
     */
    queuePositionUpdate(x: number, y: number): void;
    /**
     * Queue a position update to a specific destination to be processed in the next animation frame
     * This will override any pending delta updates
     */
    queuePositionUpdateTo(destination: Position): void;
    /**
     * Queue a position update by delta to be processed in the next animation frame
     * This will be ignored if there's a pending destination update
     */
    queuePositionUpdateBy(delta: Position): void;
    /**
     * Process and clear all queued position updates
     * @returns the update to apply to the position, with type information
     */
    processQueuedUpdates(): PositionUpdate | null;
    /**
     * Subscribe to position updates
     */
    subscribe(observer: Observer<[PositionUpdate]>, options?: SubscriptionOptions): () => void;
    /**
     * Get debug information about queue method calls since last update
     */
    getDebugInfo(): {
        lastUpdateTotalCalls: number;
        queuePositionUpdateCalls: number;
        queuePositionUpdateToCalls: number;
        queuePositionUpdateByCalls: number;
    };
}
