interface ITreeConfig<T> {
    getChildren: (dataNode: T) => T[] | undefined | null;
    getId: (dataNode: T) => string;
    getLevel: (dataNode: T) => number;
    reverse?: boolean;
}
export declare const TREE_SEPERATOR = ".";
export declare class Tree<T> {
    private config;
    private _data;
    getChildren: (dataNode: T) => T[] | undefined | null;
    getId: (dataNode: T) => string;
    getLevel: (dataNode: T) => number;
    constructor(initialData: T[], config: ITreeConfig<T>);
    get data(): readonly T[];
    get flattened(): readonly T[];
    add(...nodes: T[]): T[];
    addBefore(beforeId: string | undefined, ...nodes: T[]): void;
    remove(...nodes: T[]): T[];
    clear(): void;
    exist(node: T): boolean;
    /**
     * Move a node to a different position
     * @param node
     * @param beforeTo The position of index into the tree. If -1 move at the end
     */
    moveTo(beforeTo: number[], ...nodes: T[]): T[];
    getPosition(node: T): number[];
    private _addBefore;
    private _remove;
    /**
     * Move an node before an id
     * @param node Node to be move
     * @param recipient
     * @param beforeId
     */
    private move;
    private _getPosition;
    private getAncestorAtPosition;
    /** Recursive */
    private sortDeep;
    private sort;
    /** Recursive */
    private _getNodeById;
    getNodeByPosition(indexes: number[]): T;
    private _getByIndex;
    private getNodeAncestor;
    /** Recursive */
    private getAncestorById;
    /** Recursive */
    private flatten;
    private getIndex;
}
export {};
