namespace Sanchime.DataStructures.Trees module RedBlack = type Color = Red | Black type RedBlackTree<'T> = | Node of Color * Left: 'T RedBlackTree * Value: 'T * Right: 'T RedBlackTree | Leaf let balance = function | Black, Node (Red, Node (Red, a, x, b), y, c), z, d | Black, Node (Red, a, x, Node (Red, b, y, c)), z, d | Black, a, x, Node (Red, Node (Red, b, y, c), z, d) | Black, a, x, Node (Red, b, y, Node (Red, c, z, d)) -> Node (Red, Node (Black, a, x, b), y, Node (Black, c, z, d)) | a, b, c, d -> Node (a, b, c, d) let insert x s = let rec loop = function | Leaf -> Node (Red, Leaf, x, Leaf) | Node (color, a, y, b) as s -> if x < y then balance (color, loop a, y, b) elif y < x then balance (color, a, y, loop b) else s loop s