33 lines
1.5 KiB
Plaintext
33 lines
1.5 KiB
Plaintext
|
|
(with_import "./match.kp"
|
|
(let (
|
|
; ['R ..] or ['B ..] or ['BB]
|
|
; possibly temporarily ['BB ..] during rebalencing
|
|
empty ['B]
|
|
|
|
contains? (rec-lambda recurse (t v) (match t
|
|
['B] false
|
|
[c a x b] (cond (< v x) (recurse a v)
|
|
(= v x) true
|
|
true (recurse b v))))
|
|
|
|
blacken (lambda (t) (match t
|
|
['R a x b] ['B a x b]
|
|
t t))
|
|
balance (lambda (t) (match t
|
|
['B ['R ['R a x b] y c] z d] ['R ['B a x b] y ['B c z d]]
|
|
['B ['R a x ['R b y c]] z d] ['R ['B a x b] y ['B c z d]]
|
|
['B a x ['R ['R b y c] z d]] ['R ['B a x b] y ['B c z d]]
|
|
['B a x ['R b y ['R c z d]]] ['R ['B a x b] y ['B c z d]]
|
|
t t))
|
|
insert (lambda (t v) (let (
|
|
ins (rec-lambda ins (t) (match t
|
|
['B] ['R ['B] v ['B]]
|
|
[c a x b] (cond (< v x) (balance [c (ins a) x b])
|
|
(= v x) [c a x b]
|
|
true (balance [c a x (ins b)]))))
|
|
) (blacken (ins t))))
|
|
)
|
|
(provide empty contains? insert)
|
|
))
|