import type { Fn, ICopy, IEmpty, Maybe, Pair } from "@thi.ng/api";
import type { DistanceFn, ReadonlyVec } from "@thi.ng/vectors";
import type { IRegionQuery, ISpatialMap } from "./api.js";
type MaybeKdNode<K extends ReadonlyVec, V> = Maybe<KdNode<K, V>>;
export declare class KdNode<K extends ReadonlyVec, V> {
    d: number;
    parent?: KdNode<K, V>;
    l?: KdNode<K, V>;
    r?: KdNode<K, V>;
    k: K;
    v: V;
    constructor(parent: MaybeKdNode<K, V>, dim: number, key: K, val: V);
    get height(): number;
}
/**
 * https://en.wikipedia.org/wiki/K-d_tree
 *
 * Partially based on:
 * https://github.com/ubilabs/kd-tree-javascript
 *
 */
export declare class KdTreeMap<K extends ReadonlyVec, V> implements ICopy<KdTreeMap<K, V>>, IEmpty<KdTreeMap<K, V>>, IRegionQuery<K, V, number>, ISpatialMap<K, V> {
    readonly distanceFn: DistanceFn;
    readonly dim: number;
    protected root: MaybeKdNode<K, V>;
    protected _size: number;
    constructor(dim: number, pairs?: Iterable<Pair<K, V>>, distanceFn?: DistanceFn);
    [Symbol.iterator](): Generator<Pair<K, V>, void, unknown>;
    keys(): Generator<K, void, unknown>;
    values(): IterableIterator<V>;
    get size(): number;
    get height(): number;
    get ratio(): number;
    copy(): KdTreeMap<K, V>;
    clear(): void;
    empty(): KdTreeMap<K, V>;
    set(key: K, val: V, eps?: number): boolean;
    into(pairs: Iterable<Pair<K, V>>, eps?: number): boolean;
    remove(key: K): boolean;
    has(key: K, eps?: number): boolean;
    get(key: K, eps?: number): V | undefined;
    query(q: K, maxDist: number, limit?: number, acc?: Pair<K, V>[]): Pair<K, V>[];
    queryKeys(q: K, maxDist: number, limit?: number, acc?: K[]): K[];
    queryValues(q: K, maxDist: number, limit?: number, acc?: V[]): V[];
    protected doSelect<T>(q: K, f: Fn<KdNode<K, V>, T>, maxDist: number, maxNum?: number, acc?: T[]): T[];
    protected buildTree(points: Pair<K, V>[], depth: number, parent?: KdNode<K, V>): KdNode<K, V> | undefined;
}
export {};
//# sourceMappingURL=kd-tree-map.d.ts.map