{
:MAP
:SET
}
Where
Define (MAP compare item_key)
(make compare item_key)
Let SET
Define (item_key item) item
In
Func compare
Let MAP (make compare item_key)
In
Define (union s t)
(LIST.reduce (MAP.list s) t MAP.insert)
Define (diff s t)
(LIST.reduce (MAP.list s) MAP.empty
Func {u item}
Match (MAP.search t item) {
| 'nothing (MAP.insert u item)
| 'just._ u
})
In
{
:compare
:empty MAP.empty
:new MAP.new
:search MAP.search
:insert MAP.insert
:list MAP.list
:union
:diff
}
Where
Define (make compare item_key)
Define (search tree key)
Iterate {depth t} From {tree.depth tree.root}
Cond {
| [depth = 0] 'nothing
| [depth = 1]
Match t {
| 'one.a
If Pattern 'equal Matches (compare key (item_key a))
'just.a
'nothing
| 'two.{a b}
Cond {
| Pattern 'equal Matches (compare key (item_key a))
'just.a
| Pattern 'equal Matches (compare key (item_key b))
'just.b
| True 'nothing
}
}
| True
Match t {
| 'one.{u a v}
Match (compare key (item_key a)) {
| 'less (Continue [depth - 1] u)
| 'equal 'just.a
| 'greater (Continue [depth - 1] v)
}
| 'two.{u a v b w}
Match (compare key (item_key a)) {
| 'less (Continue [depth - 1] u)
| 'equal 'just.a
| 'greater
Match (compare key (item_key b)) {
| 'less (Continue [depth - 1] v)
| 'equal 'just.b
| 'greater (Continue [depth - 1] w)
}
}
}
}
In
Let empty
{
:depth 0
:size 0
:root 'zero
}
Define (insert tree a)
Define (insert depth tree a)
Unfold {depth tree a}
Cond {
| [depth = 1]
Match tree {
| 'one.b
Match (compare (item_key a) (item_key b)) {
| 'less 'no_split.'two.{a b}
| 'greater 'no_split.'two.{b a}
| 'equal 'no_split.'one.a
}
| 'two.{b c}
Let key_a (item_key a)
Let key_b (item_key b)
Let key_c (item_key c)
In
Match (compare key_a key_b) {
| 'less 'split.{'one.a b 'one.c}
| 'greater
Match (compare key_a key_c) {
| 'less 'split.{'one.b a 'one.c}
| 'greater 'split.{'one.b c 'one.a}
| 'equal 'no_split.'two.{b a}
}
| 'equal 'no_split.'two.{a c}
}
}
| True
Match tree {
| 'one.{u b v}
Match (compare (item_key a) (item_key b)) {
| 'less
Match (Fold [depth - 1] u a) {
| 'no_split.u
'no_split.'one.{u b v}
| 'split.{t a u}
'no_split.'two.{t a u b v}
}
| 'greater
Match (Fold [depth - 1] v a) {
| 'no_split.v
'no_split.'one.{u b v}
| 'split.{v c w}
'no_split.'two.{u b v c w}
}
| 'equal 'no_split.'one.{u a v}
}
| 'two.{t b u c v}
Let key_a (item_key a)
Let key_b (item_key b)
Let key_c (item_key c)
In
Match (compare key_a key_b) {
| 'less
Match (Fold [depth - 1] t a) {
| 'no_split.t
'no_split.'two.{t b u c v}
| 'split.{tt a tu}
'split.{'one.{tt a tu} b 'one.{u c v}}
}
| 'greater
Match (compare key_a key_c) {
| 'less
Match (Fold [depth - 1] u a) {
| 'no_split.u
'no_split.'two.{t b u c v}
| 'split.{ut a uv}
'split.{'one.{t b ut} a 'one.{uv c v}}
}
| 'greater
Match (Fold [depth - 1] v a) {
| 'no_split.v
'no_split.'two.{t b u c v}
| 'split.{vu a vv}
'split.{'one.{t b u} c 'one.{vu a vv}}
}
| 'equal 'no_split.'two.{t b u a v}
}
| 'equal 'no_split.'two.{t a u c v}
}
}
}
In
If [tree.depth = 0]
{
:depth 1
:size 1
:root 'one.a
}
Match (insert tree.depth tree.root a) {
| 'no_split.t
{
:depth tree.depth
:size [tree.size + 1]
:root t
}
| 'split.{u a v}
{
:depth [tree.depth + 1]
:size [tree.size + 1]
:root 'one.{u a v}
}
}
Define (list tree)
If [tree.depth = 0]
'nil
Unfold {depth t list} From {tree.depth tree.root 'nil}
Cond {
| [depth > 1]
Let depth [depth - 1]
In
Match t {
| 'one.{u a v}
(Fold depth u [a & (Fold depth v list)])
| 'two.{u a v b w}
Let list
(Fold depth v
[b & (Fold depth w list)])
In
(Fold depth u [a & list])
}
| [depth = 1]
Match t {
| 'one.a [a & list]
| 'two.{a b} [a & b & list]
}
}
In
Define (size tree)
tree.size
Define (new items)
(LIST.reduce items empty insert)
In
{
:compare
:item_key
:size
:new
:empty
:insert
:search
:list
}
Where
Open Z
{
:Infix >
:Infix =
:Infix +
:Infix -
}
Open LIST {:Infix &}
Where
Let STDIO Package "stdio"
Let LIST Package "list"
Let Z Package "z"