import { Observable } from '@tanbo/stream';
import { Component, Registry, Scheduler, Selection, Slot, AbstractSelection } from '@textbus/core';
import { AbstractType, Doc as YDoc, Map as YMap, RelativePosition, Text as YText } from 'yjs';
import { SubModelLoader } from './sub-model-loader';
export interface RelativePositionRecord {
    doc: YDoc;
    position: RelativePosition;
}
export interface CursorPosition {
    anchor: RelativePositionRecord;
    focus: RelativePositionRecord;
}
export interface CollaborateHistorySelectionPosition {
    before: CursorPosition | null;
    after: CursorPosition | null;
}
declare class SlotMap {
    private slotAndYTextMap;
    private yTextAndSlotMap;
    set(key: Slot, value: YText): void;
    set(key: YText, value: Slot): void;
    get(key: Slot): YText | null;
    get(key: YText): Slot | null;
    delete(key: Slot | YText): void;
}
export interface SubModelLoaded {
    yType: AbstractType<any>;
    yDoc: YDoc;
}
export declare class Collaborate {
    private scheduler;
    private registry;
    private selection;
    private subModelLoader;
    yDoc: YDoc;
    slotMap: SlotMap;
    onAddSubModel: Observable<SubModelLoaded>;
    private subscriptions;
    private updateFromRemote;
    private addSubModelEvent;
    private updateRemoteActions;
    private noRecord;
    constructor(scheduler: Scheduler, registry: Registry, selection: Selection, subModelLoader: SubModelLoader);
    syncRootComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>): void;
    syncRootSlot(yDoc: YDoc, sharedSlot: YText, localSlot: Slot): void;
    getAbstractSelection(position: CursorPosition): AbstractSelection | null;
    getRelativeCursorLocation(): CursorPosition | null;
    restoreCursorPosition(position: CursorPosition | null): void;
    private initSyncEvent;
    private syncComponent;
    private syncSlot;
    destroy(): void;
    private syncSharedMapToLocalMap;
    private createLocalMapBySharedMap;
    private createLocalArrayBySharedArray;
    private syncLocalMapToSharedMap;
    private createSharedMapByLocalMap;
    private createSharedArrayByLocalArray;
    private createSharedSlotByLocalSlot;
    private initSharedSlotByLocalSlot;
    private createLocalSlotBySharedSlot;
    private initLocalSlotBySharedSlot;
    private createSharedModelByLocalModel;
    private createLocalModelBySharedByModel;
    private createSharedComponentByLocalComponent;
    private createLocalComponentBySharedComponent;
    /**
     * 双向同步数组
     * @param sharedArray
     * @param localArray
     * @private
     */
    private syncArray;
    /**
     * 双向同步对象
     * @param sharedObject
     * @param localObject
     * @private
     */
    private syncObject;
    private runLocalUpdate;
    private runRemoteUpdate;
}
export {};
