| author | wenzelm | 
| Tue, 22 Oct 2024 12:45:38 +0200 | |
| changeset 81229 | e18600daa904 | 
| parent 77976 | ca11a87bd2c6 | 
| permissions | -rw-r--r-- | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/General/change_table.ML | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 2 | Author: Makarius | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 3 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 4 | Generic tables with extra bookkeeping of changes relative to some | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 5 | common base version, subject to implicit block structure. Support for | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 6 | efficient join/merge of big global tables with small local updates. | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 7 | *) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 8 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 9 | signature CHANGE_TABLE = | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 10 | sig | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 11 | structure Table: TABLE | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 12 | type key = Table.key | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 13 | exception DUP of key | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 14 | exception SAME | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 15 | type 'a T | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 16 | val table_of: 'a T -> 'a Table.table | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 17 | val empty: 'a T | 
| 56054 | 18 | val is_empty: 'a T -> bool | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 19 | val change_base: bool -> 'a T -> 'a T | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 20 | val change_ignore: 'a T -> 'a T | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 21 | val join: (key -> 'a * 'a -> 'a) (*exception SAME*) -> 'a T * 'a T -> 'a T (*exception DUP*) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 22 |   val merge: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T  (*exception DUP*)
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 23 | val fold: (key * 'b -> 'a -> 'a) -> 'b T -> 'a -> 'a | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 24 | val dest: 'a T -> (key * 'a) list | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 25 | val lookup_key: 'a T -> key -> (key * 'a) option | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 26 | val lookup: 'a T -> key -> 'a option | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 27 | val defined: 'a T -> key -> bool | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 28 | val update: key * 'a -> 'a T -> 'a T | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 29 | val update_new: key * 'a -> 'a T -> 'a T (*exception DUP*) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 30 |   val map_entry: key -> ('a -> 'a) -> 'a T -> 'a T
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 31 |   val map_default: key * 'a -> ('a -> 'a) -> 'a T -> 'a T
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 32 | val delete_safe: key -> 'a T -> 'a T | 
| 77976 | 33 | val lookup_list: 'a list T -> Table.key -> 'a list | 
| 77974 | 34 |   val insert_list: ('a * 'a -> bool) -> key * 'a -> 'a list T -> 'a list T
 | 
| 35 |   val remove_list: ('b * 'a -> bool) -> key * 'b -> 'a list T -> 'a list T
 | |
| 36 |   val update_list: ('a * 'a -> bool) -> key * 'a -> 'a list T -> 'a list T
 | |
| 77975 | 37 |   val merge_list: ('a * 'a -> bool) -> 'a list T * 'a list T -> 'a list T
 | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 38 | end; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 39 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 40 | functor Change_Table(Key: KEY): CHANGE_TABLE = | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 41 | struct | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 42 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 43 | structure Table = Table(Key); | 
| 77723 
b761c91c2447
performance tuning: prefer functor Set() over Table();
 wenzelm parents: 
56139diff
changeset | 44 | structure Set = Set(Key); | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 45 | type key = Table.key; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 46 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 47 | exception SAME = Table.SAME; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 48 | exception DUP = Table.DUP; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 49 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 50 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 51 | (* optional change *) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 52 | |
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 53 | datatype change = | 
| 77723 
b761c91c2447
performance tuning: prefer functor Set() over Table();
 wenzelm parents: 
56139diff
changeset | 54 |   No_Change | Change of {base: serial, depth: int, changes: Set.T option};
 | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 55 | |
| 56067 | 56 | fun make_change base depth changes = | 
| 57 |   Change {base = base, depth = depth, changes = changes};
 | |
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 58 | |
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 59 | fun ignore_change (Change {base, depth, changes = SOME _}) =
 | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 60 | make_change base depth NONE | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 61 | | ignore_change change = change; | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 62 | |
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 63 | fun update_change key (Change {base, depth, changes = SOME ch}) =
 | 
| 77723 
b761c91c2447
performance tuning: prefer functor Set() over Table();
 wenzelm parents: 
56139diff
changeset | 64 | make_change base depth (SOME (Set.insert key ch)) | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 65 | | update_change _ change = change; | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 66 | |
| 56067 | 67 | fun base_change true No_Change = | 
| 77723 
b761c91c2447
performance tuning: prefer functor Set() over Table();
 wenzelm parents: 
56139diff
changeset | 68 | make_change (serial ()) 0 (SOME Set.empty) | 
| 56067 | 69 |   | base_change true (Change {base, depth, changes}) =
 | 
| 70 | make_change base (depth + 1) changes | |
| 71 |   | base_change false (Change {base, depth, changes}) =
 | |
| 72 | if depth = 0 then No_Change else make_change base (depth - 1) changes | |
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 73 | | base_change false No_Change = raise Fail "Unbalanced change structure"; | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 74 | |
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 75 | fun cannot_merge () = raise Fail "Cannot merge: incompatible change structure"; | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 76 | |
| 56067 | 77 | fun merge_change (No_Change, No_Change) = NONE | 
| 78 | | merge_change (Change change1, Change change2) = | |
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 79 | let | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 80 |         val {base = base1, depth = depth1, changes = changes1} = change1;
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 81 |         val {base = base2, depth = depth2, changes = changes2} = change2;
 | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 82 | val _ = if base1 = base2 andalso depth1 = depth2 then () else cannot_merge (); | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 83 | val (swapped, ch2) = | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 84 | (case (changes1, changes2) of | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 85 | (_, SOME ch2) => (false, ch2) | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 86 | | (SOME ch1, _) => (true, ch1) | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 87 | | _ => cannot_merge ()); | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 88 | in SOME (swapped, ch2, make_change base1 depth1 NONE) end | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 89 | | merge_change _ = cannot_merge (); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 90 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 91 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 92 | (* table with changes *) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 93 | |
| 56067 | 94 | datatype 'a T = Change_Table of {change: change, table: 'a Table.table};
 | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 95 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 96 | fun table_of (Change_Table {table, ...}) = table;
 | 
| 56054 | 97 | |
| 56067 | 98 | val empty = Change_Table {change = No_Change, table = Table.empty};
 | 
| 99 | ||
| 100 | fun is_empty (Change_Table {change, table}) =
 | |
| 101 | (case change of No_Change => Table.is_empty table | _ => false); | |
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 102 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 103 | fun make_change_table (change, table) = Change_Table {change = change, table = table};
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 104 | fun map_change_table f (Change_Table {change, table}) = make_change_table (f (change, table));
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 105 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 106 | fun change_base begin = (map_change_table o apfst) (base_change begin); | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 107 | fun change_ignore arg = (map_change_table o apfst) ignore_change arg; | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 108 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 109 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 110 | (* join and merge *) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 111 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 112 | fun join f (arg1, arg2) = | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 113 | let | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 114 |     val Change_Table {change = change1, table = table1} = arg1;
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 115 |     val Change_Table {change = change2, table = table2} = arg2;
 | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 116 | in | 
| 56054 | 117 | if pointer_eq (change1, change2) andalso pointer_eq (table1, table2) then arg1 | 
| 118 | else if is_empty arg2 then arg1 | |
| 119 | else if is_empty arg1 then arg2 | |
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 120 | else | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 121 | (case merge_change (change1, change2) of | 
| 56067 | 122 | NONE => make_change_table (No_Change, Table.join f (table1, table2)) | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 123 | | SOME (swapped, ch2, change') => | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 124 | let | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 125 | fun maybe_swap (x, y) = if swapped then (y, x) else (x, y); | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 126 | val (tab1, tab2) = maybe_swap (table1, table2); | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 127 | fun update key tab = | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 128 | (case Table.lookup tab2 key of | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 129 | NONE => tab | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 130 | | SOME y => | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 131 | (case Table.lookup tab key of | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 132 | NONE => Table.update (key, y) tab | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 133 | | SOME x => | 
| 56139 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 134 | (case (SOME (f key (maybe_swap (x, y))) handle Table.SAME => NONE) of | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 135 | NONE => tab | 
| 
b7add947a6ef
more frugal recording of changes: join merely requires information from one side;
 wenzelm parents: 
56068diff
changeset | 136 | | SOME z => Table.update (key, z) tab))); | 
| 77723 
b761c91c2447
performance tuning: prefer functor Set() over Table();
 wenzelm parents: 
56139diff
changeset | 137 | in make_change_table (change', Set.fold update ch2 tab1) end) | 
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 138 | end; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 139 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 140 | fun merge eq = | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 141 | join (fn key => fn xy => if eq xy then raise Table.SAME else raise Table.DUP key); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 142 | |
| 77975 | 143 | fun merge_list eq = | 
| 144 | join (fn _ => fn xy => if eq_list eq xy then raise Table.SAME else Library.merge eq xy); | |
| 145 | ||
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 146 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 147 | (* derived operations *) | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 148 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 149 | fun fold f arg = Table.fold f (table_of arg); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 150 | fun dest arg = Table.dest (table_of arg); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 151 | fun lookup_key arg = Table.lookup_key (table_of arg); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 152 | fun lookup arg = Table.lookup (table_of arg); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 153 | fun defined arg = Table.defined (table_of arg); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 154 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 155 | fun change_table key f = | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 156 | map_change_table (fn (change, table) => (update_change key change, f table)); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 157 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 158 | fun update (key, x) = change_table key (Table.update (key, x)); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 159 | fun update_new (key, x) = change_table key (Table.update_new (key, x)); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 160 | fun map_entry key f = change_table key (Table.map_entry key f); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 161 | fun map_default (key, x) f = change_table key (Table.map_default (key, x) f); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 162 | fun delete_safe key = change_table key (Table.delete_safe key); | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 163 | |
| 77976 | 164 | fun lookup_list arg = Table.lookup_list (table_of arg); | 
| 77974 | 165 | fun insert_list eq (key, x) = change_table key (Table.insert_list eq (key, x)); | 
| 166 | fun remove_list eq (key, x) = change_table key (Table.remove_list eq (key, x)); | |
| 167 | fun update_list eq (key, x) = change_table key (Table.update_list eq (key, x)); | |
| 168 | ||
| 56053 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 169 | end; | 
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 170 | |
| 
030531cc4c62
tables with changes relative to some common base version -- support for efficient join/merge of big global tables with small local updates;
 wenzelm parents: diff
changeset | 171 | structure Change_Table = Change_Table(type key = string val ord = fast_string_ord); |