import { Observable } from "rxjs";
import { GenericInstanceFilter, HierarchyNode, HierarchyProvider } from "@itwin/presentation-hierarchies";
import { TreeModelHierarchyNode, TreeModelNode, TreeModelRootNode } from "./TreeModel.js";
/** @internal */
export interface LoadedTreePart {
    parentId: string | undefined;
    loadedNodes: TreeModelNode[];
}
/** @internal */
export interface HierarchyLevelOptions {
    instanceFilter?: GenericInstanceFilter;
    hierarchyLevelSizeLimit?: number | "unbounded";
}
/** @internal */
export interface LoadNodesOptions {
    parent: TreeModelHierarchyNode | TreeModelRootNode;
    getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;
    shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;
    buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;
    ignoreCache?: boolean;
}
/** @internal */
export interface ITreeLoader {
    loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;
}
/** @internal */
export declare class TreeLoader implements ITreeLoader {
    private _hierarchyProvider;
    private _onHierarchyLimitExceeded;
    private _onHierarchyLoadError;
    private _treeNodeIdFactory;
    constructor(_hierarchyProvider: HierarchyProvider, _onHierarchyLimitExceeded: (props: {
        parentId?: string;
        filter?: GenericInstanceFilter;
        limit?: number | "unbounded";
    }) => void, _onHierarchyLoadError: (props: {
        parentId?: string;
        type: "timeout" | "unknown";
        error: unknown;
    }) => void, treeNodeIdFactory?: (node: Pick<HierarchyNode, "key" | "parentKeys">) => string);
    private loadChildren;
    loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions): Observable<LoadedTreePart>;
}
//# sourceMappingURL=TreeLoader.d.ts.map