declare type Comparator = (a: T, b: T) => number; declare type Predicate = (value: T) => boolean; declare class SplayTreeNode> { readonly key: K; left: Node | null; right: Node | null; constructor(key: K); } declare class SplayTreeSetNode extends SplayTreeNode> { constructor(key: K); } declare class SplayTreeMapNode extends SplayTreeNode> { readonly value: V; constructor(key: K, value: V); replaceValue(value: V): SplayTreeMapNode; } declare abstract class SplayTree> { protected abstract root: Node | null; size: number; protected modificationCount: number; protected splayCount: number; protected abstract compare: Comparator; protected abstract validKey: Predicate; 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; protected wrap(): SplayTreeWrapper; } declare class SplayTreeMap extends SplayTree> implements Iterable<[K, V]>, Map { protected root: SplayTreeMapNode | null; protected compare: Comparator; protected validKey: Predicate; constructor(compare?: Comparator, isValidKey?: Predicate); delete(key: unknown): boolean; forEach(f: (value: V, key: K, map: Map) => void): void; get(key: unknown): V | undefined; hasValue(value: unknown): boolean; set(key: K, value: V): this; setAll(other: Map): 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; values(): IterableIterator; entries(): IterableIterator<[K, V]>; [Symbol.iterator](): IterableIterator<[K, V]>; [Symbol.toStringTag]: string; } declare class SplayTreeSet extends SplayTree> implements Iterable, Set { protected root: SplayTreeSetNode | null; protected compare: Comparator; protected validKey: Predicate; constructor(compare?: Comparator, isValidKey?: Predicate); delete(element: unknown): boolean; deleteAll(elements: Iterable): void; forEach(f: (element: E, element2: E, set: Set) => void): void; add(element: E): this; addAndReturn(element: E): E; addAll(elements: Iterable): void; isEmpty(): boolean; isNotEmpty(): boolean; single(): E; first(): E; last(): E; lastBefore(element: E): E | null; firstAfter(element: E): E | null; retainAll(elements: Iterable): void; lookup(object: unknown): E | null; intersection(other: Set): Set; difference(other: Set): Set; union(other: Set): Set; protected clone(): SplayTreeSet; protected copyNode>(node: Node | null): SplayTreeSetNode | null; toSet(): Set; entries(): IterableIterator<[E, E]>; keys(): IterableIterator; values(): IterableIterator; [Symbol.iterator](): IterableIterator; [Symbol.toStringTag]: string; } interface SplayTreeWrapper> { 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 };