Files
kraken/rb.kp
2021-08-01 22:15:58 -04:00

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)
))