29 val max_key: 'a table -> key option |
29 val max_key: 'a table -> key option |
30 val exists: (key * 'a -> bool) -> 'a table -> bool |
30 val exists: (key * 'a -> bool) -> 'a table -> bool |
31 val lookup: 'a table * key -> 'a option |
31 val lookup: 'a table * key -> 'a option |
32 val update: (key * 'a) * 'a table -> 'a table |
32 val update: (key * 'a) * 'a table -> 'a table |
33 val update_new: (key * 'a) * 'a table -> 'a table (*exception DUP*) |
33 val update_new: (key * 'a) * 'a table -> 'a table (*exception DUP*) |
|
34 val map_entry: key -> ('a -> 'a) -> 'a table -> 'a table |
34 val make: (key * 'a) list -> 'a table (*exception DUPS*) |
35 val make: (key * 'a) list -> 'a table (*exception DUPS*) |
35 val extend: 'a table * (key * 'a) list -> 'a table (*exception DUPS*) |
36 val extend: 'a table * (key * 'a) list -> 'a table (*exception DUPS*) |
36 val join: ('a * 'a -> 'a option) -> 'a table * 'a table -> 'a table (*exception DUPS*) |
37 val join: ('a * 'a -> 'a option) -> 'a table * 'a table -> 'a table (*exception DUPS*) |
37 val merge: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table (*exception DUPS*) |
38 val merge: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table (*exception DUPS*) |
38 val delete: key -> 'a table -> 'a table (* exception UNDEF *) |
39 val delete: key -> 'a table -> 'a table (*exception UNDEF*) |
39 val lookup_multi: 'a list table * key -> 'a list |
40 val lookup_multi: 'a list table * key -> 'a list |
40 val update_multi: (key * 'a) * 'a list table -> 'a list table |
41 val update_multi: (key * 'a) * 'a list table -> 'a list table |
41 val make_multi: (key * 'a) list -> 'a list table |
42 val make_multi: (key * 'a) list -> 'a list table |
42 val dest_multi: 'a list table -> (key * 'a) list |
43 val dest_multi: 'a list table -> (key * 'a) list |
43 val merge_multi: ('a * 'a -> bool) -> |
44 val merge_multi: ('a * 'a -> bool) -> |
88 fun dest tab = rev (foldl_table (fn (rev_ps, p) => p :: rev_ps) ([], tab)); |
89 fun dest tab = rev (foldl_table (fn (rev_ps, p) => p :: rev_ps) ([], tab)); |
89 fun keys tab = rev (foldl_table (fn (rev_ks, (k, _)) => k :: rev_ks) ([], tab)); |
90 fun keys tab = rev (foldl_table (fn (rev_ks, (k, _)) => k :: rev_ks) ([], tab)); |
90 fun exists P tab = foldl_table (fn (false, e) => P e | (b, _) => b) (false, tab); |
91 fun exists P tab = foldl_table (fn (false, e) => P e | (b, _) => b) (false, tab); |
91 |
92 |
92 fun min_key Empty = NONE |
93 fun min_key Empty = NONE |
93 | min_key (Branch2 (left, (k, _), _)) = SOME (getOpt (min_key left,k)) |
94 | min_key (Branch2 (left, (k, _), _)) = SOME (getOpt (min_key left, k)) |
94 | min_key (Branch3 (left, (k, _), _, _, _)) = SOME (getOpt (min_key left,k)); |
95 | min_key (Branch3 (left, (k, _), _, _, _)) = SOME (getOpt (min_key left, k)); |
95 |
96 |
96 fun max_key Empty = NONE |
97 fun max_key Empty = NONE |
97 | max_key (Branch2 (_, (k, _), right)) = SOME (getOpt (max_key right,k)) |
98 | max_key (Branch2 (_, (k, _), right)) = SOME (getOpt (max_key right, k)) |
98 | max_key (Branch3 (_, _, _, (k,_), right)) = SOME (getOpt (max_key right,k)); |
99 | max_key (Branch3 (_, _, _, (k,_), right)) = SOME (getOpt (max_key right, k)); |
|
100 |
99 |
101 |
100 (* lookup *) |
102 (* lookup *) |
101 |
103 |
102 fun lookup (Empty, _) = NONE |
104 fun lookup (Empty, _) = NONE |
103 | lookup (Branch2 (left, (k, x), right), key) = |
105 | lookup (Branch2 (left, (k, x), right), key) = |
114 LESS => lookup (mid, key) |
116 LESS => lookup (mid, key) |
115 | EQUAL => SOME x2 |
117 | EQUAL => SOME x2 |
116 | GREATER => lookup (right, key))); |
118 | GREATER => lookup (right, key))); |
117 |
119 |
118 |
120 |
119 (* update *) |
121 (* updates *) |
120 |
122 |
121 fun compare (k1, _) (k2, _) = Key.ord (k1, k2); |
123 local |
|
124 |
|
125 exception SAME; |
122 |
126 |
123 datatype 'a growth = |
127 datatype 'a growth = |
124 Stay of 'a table | |
128 Stay of 'a table | |
125 Sprout of 'a table * (key * 'a) * 'a table; |
129 Sprout of 'a table * (key * 'a) * 'a table; |
126 |
130 |
127 fun insert pair Empty = Sprout (Empty, pair, Empty) |
131 fun modify key f tab = |
128 | insert pair (Branch2 (left, p, right)) = |
132 let |
129 (case compare pair p of |
133 fun modfy Empty = Sprout (Empty, (key, f NONE), Empty) |
130 LESS => |
134 | modfy (Branch2 (left, p as (k, x), right)) = |
131 (case insert pair left of |
135 (case Key.ord (key, k) of |
132 Stay left' => Stay (Branch2 (left', p, right)) |
|
133 | Sprout (left1, q, left2) => Stay (Branch3 (left1, q, left2, p, right))) |
|
134 | EQUAL => Stay (Branch2 (left, pair, right)) |
|
135 | GREATER => |
|
136 (case insert pair right of |
|
137 Stay right' => Stay (Branch2 (left, p, right')) |
|
138 | Sprout (right1, q, right2) => |
|
139 Stay (Branch3 (left, p, right1, q, right2)))) |
|
140 | insert pair (Branch3 (left, p1, mid, p2, right)) = |
|
141 (case compare pair p1 of |
|
142 LESS => |
|
143 (case insert pair left of |
|
144 Stay left' => Stay (Branch3 (left', p1, mid, p2, right)) |
|
145 | Sprout (left1, q, left2) => |
|
146 Sprout (Branch2 (left1, q, left2), p1, Branch2 (mid, p2, right))) |
|
147 | EQUAL => Stay (Branch3 (left, pair, mid, p2, right)) |
|
148 | GREATER => |
|
149 (case compare pair p2 of |
|
150 LESS => |
136 LESS => |
151 (case insert pair mid of |
137 (case modfy left of |
152 Stay mid' => Stay (Branch3 (left, p1, mid', p2, right)) |
138 Stay left' => Stay (Branch2 (left', p, right)) |
153 | Sprout (mid1, q, mid2) => |
139 | Sprout (left1, q, left2) => Stay (Branch3 (left1, q, left2, p, right))) |
154 Sprout (Branch2 (left, p1, mid1), q, Branch2 (mid2, p2, right))) |
140 | EQUAL => Stay (Branch2 (left, (k, f (SOME x)), right)) |
155 | EQUAL => Stay (Branch3 (left, p1, mid, pair, right)) |
|
156 | GREATER => |
141 | GREATER => |
157 (case insert pair right of |
142 (case modfy right of |
158 Stay right' => Stay (Branch3 (left, p1, mid, p2, right')) |
143 Stay right' => Stay (Branch2 (left, p, right')) |
159 | Sprout (right1, q, right2) => |
144 | Sprout (right1, q, right2) => |
160 Sprout (Branch2 (left, p1, mid), p2, Branch2 (right1, q, right2))))); |
145 Stay (Branch3 (left, p, right1, q, right2)))) |
161 |
146 | modfy (Branch3 (left, p1 as (k1, x1), mid, p2 as (k2, x2), right)) = |
162 fun update (pair, tab) = |
147 (case Key.ord (key, k1) of |
163 (case insert pair tab of |
148 LESS => |
164 Stay tab => tab |
149 (case modfy left of |
165 | Sprout br => Branch2 br); |
150 Stay left' => Stay (Branch3 (left', p1, mid, p2, right)) |
166 |
151 | Sprout (left1, q, left2) => |
167 fun update_new (pair as (key, _), tab) = |
152 Sprout (Branch2 (left1, q, left2), p1, Branch2 (mid, p2, right))) |
168 if is_none (lookup (tab, key)) then update (pair, tab) |
153 | EQUAL => Stay (Branch3 (left, (k1, f (SOME x1)), mid, p2, right)) |
169 else raise DUP key; |
154 | GREATER => |
|
155 (case Key.ord (key, k2) of |
|
156 LESS => |
|
157 (case modfy mid of |
|
158 Stay mid' => Stay (Branch3 (left, p1, mid', p2, right)) |
|
159 | Sprout (mid1, q, mid2) => |
|
160 Sprout (Branch2 (left, p1, mid1), q, Branch2 (mid2, p2, right))) |
|
161 | EQUAL => Stay (Branch3 (left, p1, mid, (k2, f (SOME x2)), right)) |
|
162 | GREATER => |
|
163 (case modfy right of |
|
164 Stay right' => Stay (Branch3 (left, p1, mid, p2, right')) |
|
165 | Sprout (right1, q, right2) => |
|
166 Sprout (Branch2 (left, p1, mid), p2, Branch2 (right1, q, right2))))); |
|
167 |
|
168 in |
|
169 (case modfy tab of |
|
170 Stay tab' => tab' |
|
171 | Sprout br => Branch2 br) |
|
172 handle SAME => tab |
|
173 end; |
|
174 |
|
175 in |
|
176 |
|
177 fun update ((k, x), tab) = modify k (fn _ => x) tab; |
|
178 fun update_new ((k, x), tab) = modify k (fn NONE => x | SOME _ => raise DUP k) tab; |
|
179 fun map_entry k f = modify k (fn NONE => raise SAME | SOME x => f x); |
|
180 |
|
181 end; |
170 |
182 |
171 |
183 |
172 (* extend and make *) |
184 (* extend and make *) |
173 |
185 |
174 fun extend (table, pairs) = |
186 fun extend (table, pairs) = |
186 fun make pairs = extend (empty, pairs); |
198 fun make pairs = extend (empty, pairs); |
187 |
199 |
188 |
200 |
189 (* delete *) |
201 (* delete *) |
190 |
202 |
191 fun compare' NONE (k2, _) = LESS |
203 exception UNDEF of key; |
192 | compare' (SOME k1) (k2, _) = Key.ord (k1, k2); |
204 |
|
205 local |
|
206 |
|
207 fun compare NONE (k2, _) = LESS |
|
208 | compare (SOME k1) (k2, _) = Key.ord (k1, k2); |
193 |
209 |
194 fun if_eq EQUAL x y = x |
210 fun if_eq EQUAL x y = x |
195 | if_eq _ x y = y; |
211 | if_eq _ x y = y; |
196 |
|
197 exception UNDEF of key; |
|
198 |
212 |
199 fun del (SOME k) Empty = raise UNDEF k |
213 fun del (SOME k) Empty = raise UNDEF k |
200 | del NONE (Branch2 (Empty, p, Empty)) = (p, (true, Empty)) |
214 | del NONE (Branch2 (Empty, p, Empty)) = (p, (true, Empty)) |
201 | del NONE (Branch3 (Empty, p, Empty, q, Empty)) = |
215 | del NONE (Branch3 (Empty, p, Empty, q, Empty)) = |
202 (p, (false, Branch2 (Empty, q, Empty))) |
216 (p, (false, Branch2 (Empty, q, Empty))) |
203 | del k (Branch2 (Empty, p, Empty)) = (case compare' k p of |
217 | del k (Branch2 (Empty, p, Empty)) = (case compare k p of |
204 EQUAL => (p, (true, Empty)) | _ => raise UNDEF (valOf k)) |
218 EQUAL => (p, (true, Empty)) | _ => raise UNDEF (valOf k)) |
205 | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare' k p of |
219 | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare k p of |
206 EQUAL => (p, (false, Branch2 (Empty, q, Empty))) |
220 EQUAL => (p, (false, Branch2 (Empty, q, Empty))) |
207 | _ => (case compare' k q of |
221 | _ => (case compare k q of |
208 EQUAL => (q, (false, Branch2 (Empty, p, Empty))) |
222 EQUAL => (q, (false, Branch2 (Empty, p, Empty))) |
209 | _ => raise UNDEF (valOf k))) |
223 | _ => raise UNDEF (valOf k))) |
210 | del k (Branch2 (l, p, r)) = (case compare' k p of |
224 | del k (Branch2 (l, p, r)) = (case compare k p of |
211 LESS => (case del k l of |
225 LESS => (case del k l of |
212 (p', (false, l')) => (p', (false, Branch2 (l', p, r))) |
226 (p', (false, l')) => (p', (false, Branch2 (l', p, r))) |
213 | (p', (true, l')) => (p', case r of |
227 | (p', (true, l')) => (p', case r of |
214 Branch2 (rl, rp, rr) => |
228 Branch2 (rl, rp, rr) => |
215 (true, Branch3 (l', p, rl, rp, rr)) |
229 (true, Branch3 (l', p, rl, rp, rr)) |
220 | (p', (true, r')) => (p', case l of |
234 | (p', (true, r')) => (p', case l of |
221 Branch2 (ll, lp, lr) => |
235 Branch2 (ll, lp, lr) => |
222 (true, Branch3 (ll, lp, lr, if_eq ord p' p, r')) |
236 (true, Branch3 (ll, lp, lr, if_eq ord p' p, r')) |
223 | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2 |
237 | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2 |
224 (Branch2 (ll, lp, lm), lq, Branch2 (lr, if_eq ord p' p, r')))))) |
238 (Branch2 (ll, lp, lm), lq, Branch2 (lr, if_eq ord p' p, r')))))) |
225 | del k (Branch3 (l, p, m, q, r)) = (case compare' k q of |
239 | del k (Branch3 (l, p, m, q, r)) = (case compare k q of |
226 LESS => (case compare' k p of |
240 LESS => (case compare k p of |
227 LESS => (case del k l of |
241 LESS => (case del k l of |
228 (p', (false, l')) => (p', (false, Branch3 (l', p, m, q, r))) |
242 (p', (false, l')) => (p', (false, Branch3 (l', p, m, q, r))) |
229 | (p', (true, l')) => (p', (false, case (m, r) of |
243 | (p', (true, l')) => (p', (false, case (m, r) of |
230 (Branch2 (ml, mp, mr), Branch2 _) => |
244 (Branch2 (ml, mp, mr), Branch2 _) => |
231 Branch2 (Branch3 (l', p, ml, mp, mr), q, r) |
245 Branch2 (Branch3 (l', p, ml, mp, mr), q, r) |