import { Doc } from '../view/Doc';
import { ICursorPosition, INormalizedRange, ISelectionRange } from './types/cursor';
export declare class CursorManager {
    doc: Doc;
    private batcher;
    private cursor;
    private selection;
    constructor(doc: Doc);
    /** 获取光标 */
    getCursor(): ICursorPosition | null;
    /** 获取选区 */
    getSelection(): ISelectionRange | null;
    /** 设置光标 */
    setCursor(cursor: ICursorPosition): void;
    /** 设置选区 */
    setSelection(range: ISelectionRange): void;
    /** 把当前光标变成 preview */
    setPreviewCursor(): void;
    /** 把 preview 光标变成 commit */
    setCommitCursor(): void;
    /** 获取文档顺序 */
    normalizeRange(range: ISelectionRange): INormalizedRange;
    /** 选区变光标 */
    collapse(to?: 'start' | 'end'): void;
    /**
     * 判断光标还是选区
     * @returns
     */
    isCollapsed(): boolean;
    /** 清除光标和选区 */
    clear(): void;
    /** exp: cursorManager.batch(() => { cursorManager.setCursor(...); cursorManager.setSelection(...); }); */
    /** 在一次操作中会多次修改 cursor/selection，但只想在操作完成后广播一次最终值时，使用batch */
    batch<T>(fn: () => T): T;
    private emitChange;
    /** 广播事件 */
    private broadcastChange;
    /** 纯文档位置是否一致（忽略 phase） */
    private isSameDocPosition;
    /** 光标状态是否一致（包含 phase / placeholder） */
    private isSameCursorState;
    /** 比较文档顺序 */
    comparePositions(a: ICursorPosition, b: ICursorPosition): number;
    /** 比较 pathIndex 的字典序 */
    comparePathIndex(a?: number[], b?: number[]): number;
}
