import type { Fn, ICopy, IEmpty, Maybe, Pair } from "@thi.ng/api";
import { Heap } from "@thi.ng/heaps/heap";
import type { DistanceFn, ReadonlyVec } from "@thi.ng/vectors";
import type { IRegionQuery, ISpatialMap } from "./api.js";
type MaybeNdQtNode<K extends ReadonlyVec, V> = Maybe<NdQtNode<K, V>>;
export declare class NdQtNode<K extends ReadonlyVec, V> {
    pos: ReadonlyVec;
    ext: ReadonlyVec;
    parent?: NdQtNode<K, V>;
    children?: NdQtNode<K, V>[];
    numC: number;
    k?: K;
    v?: V;
    constructor(parent: MaybeNdQtNode<K, V>, pos: ReadonlyVec, ext: ReadonlyVec);
    clear(): void;
    set(p: K, val: V, eps: number, distFn: DistanceFn): boolean;
    setUnsafe(p: K, val: V): boolean;
    query<T>(fn: Fn<NdQtNode<K, V>, T>, p: K, r: number, max: number, acc: T[], distFn: DistanceFn): T[];
    queryKeys(p: K, r: number, max: number, acc: K[], distFn: DistanceFn): K[];
    queryValues(p: K, r: number, max: number, acc: V[], distFn: DistanceFn): V[];
    containsPoint(p: K): boolean;
    nodeForPoint(p: K): MaybeNdQtNode<K, V>;
    protected doQuery(p: K, r: number, max: number, acc: Heap<[number, NdQtNode<K, V>?]>, distFn: DistanceFn): Heap<[number, NdQtNode<K, V>?]>;
    protected ensureChild(id: number): NdQtNode<K, V>;
}
/**
 * Point-based quadtree for nD keys and optional value association. Supports
 * radial range queries and key removal with tree pruning. See
 * {@link NdQuadtreeMap.fromMinMax}.
 *
 * @remarks
 * Partially ported from Clojure version of thi.ng/geom.
 */
export declare class NdQuadtreeMap<K extends ReadonlyVec, V> implements ICopy<NdQuadtreeMap<K, V>>, IEmpty<NdQuadtreeMap<K, V>>, IRegionQuery<K, V, number>, ISpatialMap<K, V> {
    readonly distanceFn: DistanceFn;
    static readonly MAX_DIM = 16;
    /**
     * Returns a new point-based `NdQuadtreeMap` for nD keys in given region
     * defined by `min` / `max` coordinates. The dimensionality of the tree is
     * implicitly defined by the provided coordinates. Only points within that
     * region can be indexed.
     *
     * @remarks
     * Due to exponentially growing lookup tables, currently only supports up to
     * 16 dimensions.
     */
    static fromMinMax<K extends ReadonlyVec, V>(min: ReadonlyVec, max: ReadonlyVec): NdQuadtreeMap<K, V>;
    root: NdQtNode<K, V>;
    protected _size: number;
    constructor(pos: ReadonlyVec, ext: ReadonlyVec, pairs?: Iterable<Pair<K, V>>, distanceFn?: DistanceFn);
    get size(): number;
    [Symbol.iterator](): IterableIterator<Pair<K, V>>;
    keys(): IterableIterator<K>;
    values(): IterableIterator<V>;
    nodes(all?: boolean): Generator<NdQtNode<K, V>, void, unknown>;
    copy(): NdQuadtreeMap<K, V>;
    clear(): void;
    empty(): NdQuadtreeMap<K, V>;
    set(key: K, val: V, eps?: number): boolean;
    into(pairs: Iterable<Pair<K, V>>, eps?: number): boolean;
    remove(p: K): boolean;
    has(p: K, eps?: number): boolean;
    get(p: K, eps?: number): V | undefined;
    query(p: K, r: number, max?: number, acc?: Pair<K, V>[]): Pair<K, V>[];
    queryKeys(p: K, r: number, max?: number, acc?: K[]): K[];
    queryValues(p: K, r: number, max?: number, acc?: V[]): V[];
    containsPoint(p: K): boolean;
    nodeForPoint(p: K): MaybeNdQtNode<K, V>;
}
export {};
//# sourceMappingURL=nd-quadtree-map.d.ts.map