87 |
87 |
88 fun dest tab = rev (foldl_table (fn (rev_ps, p) => p :: rev_ps) ([], tab)); |
88 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)); |
89 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); |
90 fun exists P tab = foldl_table (fn (false, e) => P e | (b, _) => b) (false, tab); |
91 |
91 |
92 fun min_key Empty = None |
92 fun min_key Empty = NONE |
93 | min_key (Branch2 (left, (k, _), _)) = Some (if_none (min_key left) k) |
93 | min_key (Branch2 (left, (k, _), _)) = SOME (if_none (min_key left) k) |
94 | min_key (Branch3 (left, (k, _), _, _, _)) = Some (if_none (min_key left) k); |
94 | min_key (Branch3 (left, (k, _), _, _, _)) = SOME (if_none (min_key left) k); |
95 |
95 |
96 fun max_key Empty = None |
96 fun max_key Empty = NONE |
97 | max_key (Branch2 (_, (k, _), right)) = Some (if_none (max_key right) k) |
97 | max_key (Branch2 (_, (k, _), right)) = SOME (if_none (max_key right) k) |
98 | max_key (Branch3 (_, _, _, (k,_), right)) = Some (if_none (max_key right) k); |
98 | max_key (Branch3 (_, _, _, (k,_), right)) = SOME (if_none (max_key right) k); |
99 |
99 |
100 (* lookup *) |
100 (* lookup *) |
101 |
101 |
102 fun lookup (Empty, _) = None |
102 fun lookup (Empty, _) = NONE |
103 | lookup (Branch2 (left, (k, x), right), key) = |
103 | lookup (Branch2 (left, (k, x), right), key) = |
104 (case Key.ord (key, k) of |
104 (case Key.ord (key, k) of |
105 LESS => lookup (left, key) |
105 LESS => lookup (left, key) |
106 | EQUAL => Some x |
106 | EQUAL => SOME x |
107 | GREATER => lookup (right, key)) |
107 | GREATER => lookup (right, key)) |
108 | lookup (Branch3 (left, (k1, x1), mid, (k2, x2), right), key) = |
108 | lookup (Branch3 (left, (k1, x1), mid, (k2, x2), right), key) = |
109 (case Key.ord (key, k1) of |
109 (case Key.ord (key, k1) of |
110 LESS => lookup (left, key) |
110 LESS => lookup (left, key) |
111 | EQUAL => Some x1 |
111 | EQUAL => SOME x1 |
112 | GREATER => |
112 | GREATER => |
113 (case Key.ord (key, k2) of |
113 (case Key.ord (key, k2) of |
114 LESS => lookup (mid, key) |
114 LESS => lookup (mid, key) |
115 | EQUAL => Some x2 |
115 | EQUAL => SOME x2 |
116 | GREATER => lookup (right, key))); |
116 | GREATER => lookup (right, key))); |
117 |
117 |
118 |
118 |
119 (* update *) |
119 (* update *) |
120 |
120 |
173 |
173 |
174 fun extend (table, pairs) = |
174 fun extend (table, pairs) = |
175 let |
175 let |
176 fun add ((tab, dups), (key, x)) = |
176 fun add ((tab, dups), (key, x)) = |
177 (case lookup (tab, key) of |
177 (case lookup (tab, key) of |
178 None => (update ((key, x), tab), dups) |
178 NONE => (update ((key, x), tab), dups) |
179 | _ => (tab, key :: dups)); |
179 | _ => (tab, key :: dups)); |
180 in |
180 in |
181 (case foldl add ((table, []), pairs) of |
181 (case foldl add ((table, []), pairs) of |
182 (table', []) => table' |
182 (table', []) => table' |
183 | (_, dups) => raise DUPS (rev dups)) |
183 | (_, dups) => raise DUPS (rev dups)) |
186 fun make pairs = extend (empty, pairs); |
186 fun make pairs = extend (empty, pairs); |
187 |
187 |
188 |
188 |
189 (* delete *) |
189 (* delete *) |
190 |
190 |
191 fun compare' None (k2, _) = LESS |
191 fun compare' NONE (k2, _) = LESS |
192 | compare' (Some k1) (k2, _) = Key.ord (k1, k2); |
192 | compare' (SOME k1) (k2, _) = Key.ord (k1, k2); |
193 |
193 |
194 fun if_eq EQUAL x y = x |
194 fun if_eq EQUAL x y = x |
195 | if_eq _ x y = y; |
195 | if_eq _ x y = y; |
196 |
196 |
197 exception UNDEF of key; |
197 exception UNDEF of key; |
198 |
198 |
199 fun del (Some k) Empty = raise UNDEF k |
199 fun del (SOME k) Empty = raise UNDEF k |
200 | del None (Branch2 (Empty, p, Empty)) = (p, (true, Empty)) |
200 | del NONE (Branch2 (Empty, p, Empty)) = (p, (true, Empty)) |
201 | del None (Branch3 (Empty, p, Empty, q, Empty)) = |
201 | del NONE (Branch3 (Empty, p, Empty, q, Empty)) = |
202 (p, (false, Branch2 (Empty, q, Empty))) |
202 (p, (false, Branch2 (Empty, q, Empty))) |
203 | del k (Branch2 (Empty, p, Empty)) = (case compare' k p of |
203 | del k (Branch2 (Empty, p, Empty)) = (case compare' k p of |
204 EQUAL => (p, (true, Empty)) | _ => raise UNDEF (the k)) |
204 EQUAL => (p, (true, Empty)) | _ => raise UNDEF (the k)) |
205 | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare' k p of |
205 | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare' k p of |
206 EQUAL => (p, (false, Branch2 (Empty, q, Empty))) |
206 EQUAL => (p, (false, Branch2 (Empty, q, Empty))) |
213 | (p', (true, l')) => (p', case r of |
213 | (p', (true, l')) => (p', case r of |
214 Branch2 (rl, rp, rr) => |
214 Branch2 (rl, rp, rr) => |
215 (true, Branch3 (l', p, rl, rp, rr)) |
215 (true, Branch3 (l', p, rl, rp, rr)) |
216 | Branch3 (rl, rp, rm, rq, rr) => (false, Branch2 |
216 | Branch3 (rl, rp, rm, rq, rr) => (false, Branch2 |
217 (Branch2 (l', p, rl), rp, Branch2 (rm, rq, rr))))) |
217 (Branch2 (l', p, rl), rp, Branch2 (rm, rq, rr))))) |
218 | ord => (case del (if_eq ord None k) r of |
218 | ord => (case del (if_eq ord NONE k) r of |
219 (p', (false, r')) => (p', (false, Branch2 (l, if_eq ord p' p, r'))) |
219 (p', (false, r')) => (p', (false, Branch2 (l, if_eq ord p' p, r'))) |
220 | (p', (true, r')) => (p', case l of |
220 | (p', (true, r')) => (p', case l of |
221 Branch2 (ll, lp, lr) => |
221 Branch2 (ll, lp, lr) => |
222 (true, Branch3 (ll, lp, lr, if_eq ord p' p, r')) |
222 (true, Branch3 (ll, lp, lr, if_eq ord p' p, r')) |
223 | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2 |
223 | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2 |
232 | (Branch3 (ml, mp, mm, mq, mr), _) => |
232 | (Branch3 (ml, mp, mm, mq, mr), _) => |
233 Branch3 (Branch2 (l', p, ml), mp, Branch2 (mm, mq, mr), q, r) |
233 Branch3 (Branch2 (l', p, ml), mp, Branch2 (mm, mq, mr), q, r) |
234 | (Branch2 (ml, mp, mr), Branch3 (rl, rp, rm, rq, rr)) => |
234 | (Branch2 (ml, mp, mr), Branch3 (rl, rp, rm, rq, rr)) => |
235 Branch3 (Branch2 (l', p, ml), mp, Branch2 (mr, q, rl), rp, |
235 Branch3 (Branch2 (l', p, ml), mp, Branch2 (mr, q, rl), rp, |
236 Branch2 (rm, rq, rr))))) |
236 Branch2 (rm, rq, rr))))) |
237 | ord => (case del (if_eq ord None k) m of |
237 | ord => (case del (if_eq ord NONE k) m of |
238 (p', (false, m')) => |
238 (p', (false, m')) => |
239 (p', (false, Branch3 (l, if_eq ord p' p, m', q, r))) |
239 (p', (false, Branch3 (l, if_eq ord p' p, m', q, r))) |
240 | (p', (true, m')) => (p', (false, case (l, r) of |
240 | (p', (true, m')) => (p', (false, case (l, r) of |
241 (Branch2 (ll, lp, lr), Branch2 _) => |
241 (Branch2 (ll, lp, lr), Branch2 _) => |
242 Branch2 (Branch3 (ll, lp, lr, if_eq ord p' p, m'), q, r) |
242 Branch2 (Branch3 (ll, lp, lr, if_eq ord p' p, m'), q, r) |
244 Branch3 (Branch2 (ll, lp, lm), lq, |
244 Branch3 (Branch2 (ll, lp, lm), lq, |
245 Branch2 (lr, if_eq ord p' p, m'), q, r) |
245 Branch2 (lr, if_eq ord p' p, m'), q, r) |
246 | (_, Branch3 (rl, rp, rm, rq, rr)) => |
246 | (_, Branch3 (rl, rp, rm, rq, rr)) => |
247 Branch3 (l, if_eq ord p' p, Branch2 (m', q, rl), rp, |
247 Branch3 (l, if_eq ord p' p, Branch2 (m', q, rl), rp, |
248 Branch2 (rm, rq, rr)))))) |
248 Branch2 (rm, rq, rr)))))) |
249 | ord => (case del (if_eq ord None k) r of |
249 | ord => (case del (if_eq ord NONE k) r of |
250 (q', (false, r')) => |
250 (q', (false, r')) => |
251 (q', (false, Branch3 (l, p, m, if_eq ord q' q, r'))) |
251 (q', (false, Branch3 (l, p, m, if_eq ord q' q, r'))) |
252 | (q', (true, r')) => (q', (false, case (l, m) of |
252 | (q', (true, r')) => (q', (false, case (l, m) of |
253 (Branch2 _, Branch2 (ml, mp, mr)) => |
253 (Branch2 _, Branch2 (ml, mp, mr)) => |
254 Branch2 (l, p, Branch3 (ml, mp, mr, if_eq ord q' q, r')) |
254 Branch2 (l, p, Branch3 (ml, mp, mr, if_eq ord q' q, r')) |
257 Branch2 (mr, if_eq ord q' q, r')) |
257 Branch2 (mr, if_eq ord q' q, r')) |
258 | (Branch3 (ll, lp, lm, lq, lr), Branch2 (ml, mp, mr)) => |
258 | (Branch3 (ll, lp, lm, lq, lr), Branch2 (ml, mp, mr)) => |
259 Branch3 (Branch2 (ll, lp, lm), lq, Branch2 (lr, p, ml), mp, |
259 Branch3 (Branch2 (ll, lp, lm), lq, Branch2 (lr, p, ml), mp, |
260 Branch2 (mr, if_eq ord q' q, r')))))); |
260 Branch2 (mr, if_eq ord q' q, r')))))); |
261 |
261 |
262 fun delete k t = snd (snd (del (Some k) t)); |
262 fun delete k t = snd (snd (del (SOME k) t)); |
263 |
263 |
264 |
264 |
265 (* join and merge *) |
265 (* join and merge *) |
266 |
266 |
267 fun join f (table1, table2) = |
267 fun join f (table1, table2) = |
268 let |
268 let |
269 fun add ((tab, dups), (key, x)) = |
269 fun add ((tab, dups), (key, x)) = |
270 (case lookup (tab, key) of |
270 (case lookup (tab, key) of |
271 None => (update ((key, x), tab), dups) |
271 NONE => (update ((key, x), tab), dups) |
272 | Some y => |
272 | SOME y => |
273 (case f (y, x) of |
273 (case f (y, x) of |
274 Some z => (update ((key, z), tab), dups) |
274 SOME z => (update ((key, z), tab), dups) |
275 | None => (tab, key :: dups))); |
275 | NONE => (tab, key :: dups))); |
276 in |
276 in |
277 (case foldl_table add ((table1, []), table2) of |
277 (case foldl_table add ((table1, []), table2) of |
278 (table', []) => table' |
278 (table', []) => table' |
279 | (_, dups) => raise DUPS (rev dups)) |
279 | (_, dups) => raise DUPS (rev dups)) |
280 end; |
280 end; |
281 |
281 |
282 fun merge eq tabs = join (fn (y, x) => if eq (y, x) then Some y else None) tabs; |
282 fun merge eq tabs = join (fn (y, x) => if eq (y, x) then SOME y else NONE) tabs; |
283 |
283 |
284 |
284 |
285 (* tables with multiple entries per key (preserving order) *) |
285 (* tables with multiple entries per key (preserving order) *) |
286 |
286 |
287 fun lookup_multi tab_key = if_none (lookup tab_key) []; |
287 fun lookup_multi tab_key = if_none (lookup tab_key) []; |
288 fun update_multi ((key, x), tab) = update ((key, x :: lookup_multi (tab, key)), tab); |
288 fun update_multi ((key, x), tab) = update ((key, x :: lookup_multi (tab, key)), tab); |
289 |
289 |
290 fun make_multi pairs = foldr update_multi (pairs, empty); |
290 fun make_multi pairs = foldr update_multi (pairs, empty); |
291 fun dest_multi tab = flat (map (fn (key, xs) => map (Library.pair key) xs) (dest tab)); |
291 fun dest_multi tab = flat (map (fn (key, xs) => map (Library.pair key) xs) (dest tab)); |
292 fun merge_multi eq tabs = join (fn (xs, xs') => Some (gen_merge_lists eq xs xs')) tabs; |
292 fun merge_multi eq tabs = join (fn (xs, xs') => SOME (gen_merge_lists eq xs xs')) tabs; |
293 fun merge_multi' eq tabs = join (fn (xs, xs') => Some (gen_merge_lists' eq xs xs')) tabs; |
293 fun merge_multi' eq tabs = join (fn (xs, xs') => SOME (gen_merge_lists' eq xs xs')) tabs; |
294 |
294 |
295 |
295 |
296 (*final declarations of this structure!*) |
296 (*final declarations of this structure!*) |
297 val map = map_table; |
297 val map = map_table; |
298 val foldl = foldl_table; |
298 val foldl = foldl_table; |