Skip to content

Commit 76369fb

Browse files
committed
---
yaml --- r: 5065 b: refs/heads/master c: 959938e h: refs/heads/master i: 5063: c779c37 v: v3
1 parent 36593c9 commit 76369fb

File tree

3 files changed

+83
-1
lines changed

3 files changed

+83
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 6209e844eefe6058fab2c0427e4a6f4ff21dc865
2+
refs/heads/master: 959938e89144435c3a2fb1752527cfb17dd071a4

trunk/src/lib/fun_treemap.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
A functional key,value store that works on anything.
3+
4+
This works using a binary search tree. In the first version, it's a
5+
very naive algorithm, but it will probably be updated to be a
6+
red-black tree or something else.
7+
8+
This is copied and modified from treemap right now. It's missing a lot
9+
of features.
10+
11+
*/
12+
13+
import option::some;
14+
import option::none;
15+
import option = option::t;
16+
17+
export treemap;
18+
export init;
19+
export insert;
20+
export find;
21+
export traverse;
22+
23+
tag tree_node<@K, @V> {
24+
empty;
25+
node(@K, @V, @tree_node<K, V>, @tree_node<K, V>);
26+
}
27+
28+
type treemap<@K, @V> = @tree_node<K, V>;
29+
30+
fn init<@K, @V>() -> treemap<K, V> { @empty }
31+
32+
fn insert<@K, @V>(m : &treemap<K, V>, k : &K, v : &V) -> treemap<K,V> {
33+
@alt m {
34+
@empty. {
35+
node(@k, @v, @empty, @empty)
36+
}
37+
@node(@kk, vv, left, right) {
38+
if k < kk {
39+
node(@kk, vv, insert(left, k, v), right)
40+
} else if k == kk {
41+
node(@kk, @v, left, right)
42+
} else {
43+
node(@kk, vv, left, insert(right, k, v))
44+
}
45+
}
46+
}
47+
}
48+
49+
fn find<@K, @V>(m : &treemap<K, V>, k : &K) -> option<V> {
50+
alt *m {
51+
empty. { none }
52+
node(@kk, @v, left, right) {
53+
if k == kk { some(v) }
54+
else if k < kk { find(left, k) }
55+
else { find(right, k) }
56+
}
57+
}
58+
}
59+
60+
61+
// Performs an in-order traversal
62+
fn traverse<@K, @V>(m : &treemap<K, V>, f : fn(&K, &V)) {
63+
alt *m {
64+
empty. { }
65+
node(@k, @v, _, _) {
66+
// copy v to make aliases work out
67+
let v1 = v;
68+
alt *m {
69+
node(_, _, left, _) {
70+
traverse(left, f);
71+
}
72+
}
73+
f(k, v1);
74+
alt *m {
75+
node(_, _, _, right) {
76+
traverse(right, f);
77+
}
78+
}
79+
}
80+
}
81+
}

trunk/src/lib/std.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ mod net;
7676
// FIXME: parametric
7777
mod map;
7878
mod treemap;
79+
mod fun_treemap;
7980
mod deque;
8081
mod list;
8182
mod rand;

0 commit comments

Comments
 (0)