import type { Printable } from 'tree-dump';
export interface ITreeNode<K = unknown, V = unknown> {
    p: ITreeNode<K, V> | undefined;
    l: ITreeNode<K, V> | undefined;
    r: ITreeNode<K, V> | undefined;
    k: K;
    v: V;
}
export interface HeadlessNode {
    p: HeadlessNode | undefined;
    l: HeadlessNode | undefined;
    r: HeadlessNode | undefined;
}
export type Comparator<T> = (a: T, b: T) => number;
export interface SonicNodePublicReference<N extends Pick<ITreeNode, 'k' | 'v'>> {
    readonly k: N['k'];
    v: N['v'];
}
export interface SonicMap<K, V, Node extends ITreeNode<K, V> = ITreeNode<K, V>> extends Printable {
    root: Node | undefined;
    comparator: Comparator<K>;
    get(k: K): V | undefined;
    del(k: K): boolean;
    clear(): void;
    has(k: K): boolean;
    size(): number;
    isEmpty(): boolean;
    next: <N extends HeadlessNode>(curr: N) => N | undefined;
    set(k: K, v: V): SonicNodePublicReference<Node>;
    first(): SonicNodePublicReference<Node> | undefined;
    last(): SonicNodePublicReference<Node> | undefined;
    find(k: K): SonicNodePublicReference<Node> | undefined;
    getOrNextLower(k: K): SonicNodePublicReference<Node> | undefined;
    forEach(fn: (node: SonicNodePublicReference<Node>) => void): void;
    iterator0(): () => undefined | SonicNodePublicReference<Node>;
    iterator(): Iterator<SonicNodePublicReference<Node>>;
    entries(): IterableIterator<SonicNodePublicReference<Node>>;
}
