import { Observable } from "rxjs";
import { ECClassHierarchyInspector, ECSchemaProvider, IPrimitiveValueFormatter } from "@itwin/presentation-shared";
import { ParentHierarchyNode } from "../../HierarchyNode.js";
import { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, ProcessedInstanceHierarchyNode } from "../IModelHierarchyNode.js";
import { PropertiesGroupingLocalizedStrings } from "./grouping/PropertiesGrouping.js";
/** @internal */
export declare const LOGGING_NAMESPACE: string;
/** @internal */
export declare function createGroupingOperator(imodelAccess: ECSchemaProvider & ECClassHierarchyInspector, parentNode: ParentHierarchyNode | undefined, valueFormatter: IPrimitiveValueFormatter, localizedStrings: PropertiesGroupingLocalizedStrings, onNodesGrouped?: (groupingResult: GroupingHandlerResult | undefined, handler: GroupingHandler) => void, onGroupingNodeCreated?: (groupingNode: ProcessedGroupingHierarchyNode) => void, groupingHandlers?: GroupingHandler[]): (nodes: Observable<ProcessedHierarchyNode>) => Observable<ProcessedHierarchyNode>;
/** @internal */
export type ProcessedInstancesGroupingHierarchyNode = Omit<ProcessedGroupingHierarchyNode, "children"> & {
    children: ProcessedInstanceHierarchyNode[];
};
/** @internal */
export interface GroupingHandlerResult {
    /** Expected to be sorted by label. */
    grouped: Array<ProcessedInstancesGroupingHierarchyNode>;
    /** Expected to be sorted by label. */
    ungrouped: ProcessedInstanceHierarchyNode[];
    groupingType: GroupingType;
}
/** @internal */
export type GroupingType = "label" | "class" | "base-class" | "property";
/** @internal */
export type GroupingHandler = (nodesToGroup: ProcessedInstanceHierarchyNode[], nodesAlreadyGrouped: ProcessedInstancesGroupingHierarchyNode[]) => Promise<GroupingHandlerResult>;
//# sourceMappingURL=Grouping.d.ts.map