open Okasaki
open OrderedSig
open FsetSig
module RedBlackSet (Element : Ordered) : Fset =
struct
type elem = Element.t
type color = Red | Black
type tree = Empty | Node of color * tree * elem * tree
type set = tree
let empty = Empty
let rec member x = function
| Empty -> false
| Node (_,a,y,b) ->
if Element.lt x y then member x a
else if Element.lt y x then member x b
else true
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))
| (c,a,x,y) -> Node (c,a,x,y)
let rec insert x s =
let rec ins = function
| Empty -> Node (Red, Empty, x, Empty)
| Node (col, a, y, b) as s ->
if Element.lt x y then balance (col, ins a, y, b)
else if Element.lt y x then balance (col, a, y, ins b)
else s
in
match ins s with
| Empty -> raise BrokenInvariant
| Node (_, a, y, b) -> Node (Black, a, y, b)
end
|