/** @internal */ export const Color = { Red: 0 as Node.Color, Black: 1 << 0 as Node.Color } as const export declare namespace Node { export type Color = number & { readonly Color: unique symbol } } export interface Node { color: Node.Color key: K value: V left: Node | undefined right: Node | undefined count: number } /** @internal */ export const clone = ({ color, count, key, left, right, value }: Node) => ({ color, key, value, left, right, count }) /** @internal */ export function swap(n: Node, v: Node) { n.key = v.key n.value = v.value n.left = v.left n.right = v.right n.color = v.color n.count = v.count } /** @internal */ export const repaint = ({ count, key, left, right, value }: Node, color: Node.Color) => ({ color, key, value, left, right, count }) /** @internal */ export const recount = (node: Node) => { node.count = 1 + (node.left?.count ?? 0) + (node.right?.count ?? 0) }