1 (* Title: Pure/item_net.ML
2 Author: Markus Wenzel, TU Muenchen
4 Efficient storage of items indexed by terms; preserves order and
11 val init: ('a * 'a -> bool) -> ('a -> term list) -> 'a T
12 val content: 'a T -> 'a list
13 val retrieve: 'a T -> term -> 'a list
14 val member: 'a T -> 'a -> bool
15 val merge: 'a T * 'a T -> 'a T
16 val remove: 'a -> 'a T -> 'a T
17 val update: 'a -> 'a T -> 'a T
20 structure Item_Net: ITEM_NET =
28 index: 'a -> term list,
31 net: (int * 'a) Net.net};
33 fun mk_items eq index content next net =
34 Items {eq = eq, index = index, content = content, next = next, net = net};
36 fun init eq index = mk_items eq index [] ~1 Net.empty;
38 fun content (Items {content, ...}) = content;
39 fun retrieve (Items {net, ...}) = order_list o Net.unify_term net;
42 (* standard operations *)
44 fun member (Items {eq, index, content, net, ...}) x =
46 [] => Library.member eq content x
47 | t :: _ => exists (fn (_, y) => eq (x, y)) (Net.unify_term net t));
49 fun cons x (Items {eq, index, content, next, net}) =
50 mk_items eq index (x :: content) (next - 1)
51 (fold (fn t => Net.insert_term (K false) (t, (next, x))) (index x) net);
53 fun merge (items1, Items {content = content2, ...}) =
54 fold_rev (fn y => if member items1 y then I else cons y) content2 items1;
56 fun remove x (items as Items {eq, index, content, next, net}) =
57 if member items x then
58 mk_items eq index (Library.remove eq x content) next
59 (fold (fn t => Net.delete_term_safe (eq o pairself #2) (t, (0, x))) (index x) net)
62 fun update x items = cons x (remove x items);