declare type Comparator<T> = (a: T, b: T) => number;
declare type Predicate<T> = (value: T) => boolean;
declare class SplayTreeNode<K, Node extends SplayTreeNode<K, Node>> {
    readonly key: K;
    left: Node | null;
    right: Node | null;
    constructor(key: K);
}
declare class SplayTreeSetNode<K> extends SplayTreeNode<K, SplayTreeSetNode<K>> {
    constructor(key: K);
}
declare class SplayTreeMapNode<K, V> extends SplayTreeNode<K, SplayTreeMapNode<K, V>> {
    readonly value: V;
    constructor(key: K, value: V);
    replaceValue(value: V): SplayTreeMapNode<K, V>;
}
declare abstract class SplayTree<K, Node extends SplayTreeNode<K, Node>> {
    protected abstract root: Node | null;
    size: number;
    protected modificationCount: number;
    protected splayCount: number;
    protected abstract compare: Comparator<K>;
    protected abstract validKey: Predicate<unknown>;
    protected splay(key: K): number;
    protected splayMin(node: Node): Node;
    protected splayMax(node: Node): Node;
    protected _delete(key: K): Node | null;
    protected addNewRoot(node: Node, comp: number): void;
    protected _first(): Node | null;
    protected _last(): Node | null;
    clear(): void;
    has(key: unknown): boolean;
    protected defaultCompare(): Comparator<K>;
    protected wrap(): SplayTreeWrapper<K, Node>;
}
declare class SplayTreeMap<K, V> extends SplayTree<K, SplayTreeMapNode<K, V>> implements Iterable<[K, V]>, Map<K, V> {
    protected root: SplayTreeMapNode<K, V> | null;
    protected compare: Comparator<K>;
    protected validKey: Predicate<unknown>;
    constructor(compare?: Comparator<K>, isValidKey?: Predicate<unknown>);
    delete(key: unknown): boolean;
    forEach(f: (value: V, key: K, map: Map<K, V>) => void): void;
    get(key: unknown): V | undefined;
    hasValue(value: unknown): boolean;
    set(key: K, value: V): this;
    setAll(other: Map<K, V>): void;
    setIfAbsent(key: K, ifAbsent: () => V): V;
    isEmpty(): boolean;
    isNotEmpty(): boolean;
    firstKey(): K | null;
    lastKey(): K | null;
    lastKeyBefore(key: K): K | null;
    firstKeyAfter(key: K): K | null;
    update(key: K, update: (value: V) => V, ifAbsent?: () => V): V;
    updateAll(update: (key: K, value: V) => V): void;
    keys(): IterableIterator<K>;
    values(): IterableIterator<V>;
    entries(): IterableIterator<[K, V]>;
    [Symbol.iterator](): IterableIterator<[K, V]>;
    [Symbol.toStringTag]: string;
}
declare class SplayTreeSet<E> extends SplayTree<E, SplayTreeSetNode<E>> implements Iterable<E>, Set<E> {
    protected root: SplayTreeSetNode<E> | null;
    protected compare: Comparator<E>;
    protected validKey: Predicate<unknown>;
    constructor(compare?: Comparator<E>, isValidKey?: Predicate<unknown>);
    delete(element: unknown): boolean;
    deleteAll(elements: Iterable<unknown>): void;
    forEach(f: (element: E, element2: E, set: Set<E>) => void): void;
    add(element: E): this;
    addAndReturn(element: E): E;
    addAll(elements: Iterable<E>): void;
    isEmpty(): boolean;
    isNotEmpty(): boolean;
    single(): E;
    first(): E;
    last(): E;
    lastBefore(element: E): E | null;
    firstAfter(element: E): E | null;
    retainAll(elements: Iterable<unknown>): void;
    lookup(object: unknown): E | null;
    intersection(other: Set<unknown>): Set<E>;
    difference(other: Set<unknown>): Set<E>;
    union(other: Set<E>): Set<E>;
    protected clone(): SplayTreeSet<E>;
    protected copyNode<Node extends SplayTreeNode<E, Node>>(node: Node | null): SplayTreeSetNode<E> | null;
    toSet(): Set<E>;
    entries(): IterableIterator<[E, E]>;
    keys(): IterableIterator<E>;
    values(): IterableIterator<E>;
    [Symbol.iterator](): IterableIterator<E>;
    [Symbol.toStringTag]: string;
}
interface SplayTreeWrapper<K, Node extends SplayTreeNode<K, Node>> {
    getRoot: () => Node | null;
    setRoot: (root: Node | null) => void;
    getSize: () => number;
    getModificationCount: () => number;
    getSplayCount: () => number;
    setSplayCount: (count: number) => void;
    splay: (key: K) => number;
    has: (key: unknown) => boolean;
}

export { SplayTreeMap, SplayTreeSet };