1 (* Copied from OCaml's Map to make it polymorphic *)
5 | Node of ('k,'a) map * 'k * 'a * ('k,'a) map * int
11 | Node(_,_,_,_,h) -> h
13 let rec find x = function
16 | Node(l, v, d, r, _) ->
17 let c = compare x v in
19 else find x (if c < 0 then l else r)
22 let hl = height l and hr = height r in
23 Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))
26 let hl = match l with Empty -> 0 | Node(_,_,_,_,h) -> h in
27 let hr = match r with Empty -> 0 | Node(_,_,_,_,h) -> h in
28 if hl > hr + 2 then begin
30 Empty -> invalid_arg "Map.bal"
31 | Node(ll, lv, ld, lr, _) ->
32 if height ll >= height lr then
33 create ll lv ld (create lr x d r)
36 Empty -> invalid_arg "Map.bal"
37 | Node(lrl, lrv, lrd, lrr, _)->
38 create (create ll lv ld lrl) lrv lrd (create lrr x d r)
40 end else if hr > hl + 2 then begin
42 Empty -> invalid_arg "Map.bal"
43 | Node(rl, rv, rd, rr, _) ->
44 if height rr >= height rl then
45 create (create l x d rl) rv rd rr
48 Empty -> invalid_arg "Map.bal"
49 | Node(rll, rlv, rld, rlr, _) ->
50 create (create l x d rll) rlv rld (create rlr rv rd rr)
53 Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))
55 let rec add x data = function
57 Node(Empty, x, data, Empty, 1)
58 | Node(l, v, d, r, h) ->
59 let c = compare x v in
61 Node(l, x, data, r, h)
63 bal (add x data l) v d r
65 bal l v d (add x data r)
67 let rec min_binding = function
68 Empty -> raise Not_found
69 | Node(Empty, x, d, r, _) -> (x, d)
70 | Node(l, x, d, r, _) -> min_binding l
72 let rec remove_min_binding = function
73 Empty -> invalid_arg "Map.remove_min_elt"
74 | Node(Empty, x, d, r, _) -> r
75 | Node(l, x, d, r, _) -> bal (remove_min_binding l) x d r
82 let (x, d) = min_binding t2 in
83 bal t1 x d (remove_min_binding t2)
85 let rec remove x = function
88 | Node(l, v, d, r, h) ->
89 let c = compare x v in
93 bal (remove x l) v d r
95 bal l v d (remove x r)
97 let rec fold f m accu =
100 | Node(l, v, d, r, _) ->
101 fold f r (f v d (fold f l accu))
103 (* Copied from atom.ml *)