Generic tables with extra bookkeeping of changes relative to some common base version, subject to implicit block structure. Support for efficient join/merge of big global tables with small local updates.
*)
signature CHANGE_TABLE = sig structure Table: TABLE type key = Table.key
exception DUP of key
exception SAME type'a T val table_of: 'a T -> 'a Table.table val empty: 'a T val is_empty: 'a T -> bool val change_base: bool -> 'a T -> 'a T val change_ignore: 'a T -> 'a T val join: (key -> 'a * 'a -> 'a) (*exception SAME*) -> 'a T * 'a T -> 'a T (*exception DUP*) val merge: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T (*exception DUP*) val fold: (key * 'b -> 'a -> 'a) -> 'b T -> 'a -> 'a val dest: 'a T -> (key * 'a) list val lookup_key: 'a T -> key -> (key * 'a) option val lookup: 'a T -> key -> 'a option val defined: 'a T -> key -> bool val update: key * 'a -> 'a T -> 'a T val update_new: key * 'a -> 'a T -> 'a T (*exception DUP*) val map_entry: key -> ('a -> 'a) -> 'a T -> 'a T val map_default: key * 'a -> ('a -> 'a) -> 'a T -> 'a T val delete_safe: key -> 'a T -> 'a T val lookup_list: 'a list T -> Table.key -> 'a list val insert_list: ('a * 'a -> bool) -> key * 'a -> 'a list T -> 'a list T val remove_list: ('b * 'a -> bool) -> key * 'b -> 'a list T -> 'a list T val update_list: ('a * 'a -> bool) -> key * 'a -> 'a list T -> 'a list T val merge_list: ('a * 'a -> bool) -> 'a list T * 'a list T -> 'a list T end;
fun fold f arg = Table.fold f (table_of arg); fun dest arg = Table.dest (table_of arg); fun lookup_key arg = Table.lookup_key (table_of arg); fun lookup arg = Table.lookup (table_of arg); fun defined arg = Table.defined (table_of arg);
fun change_table key f =
map_change_table (fn (change, table) => (update_change key change, f table));
fun update (key, x) = change_table key (Table.update (key, x)); fun update_new (key, x) = change_table key (Table.update_new (key, x)); fun map_entry key f = change_table key (Table.map_entry key f); fun map_default (key, x) f = change_table key (Table.map_default (key, x) f); fun delete_safe key = change_table key (Table.delete_safe key);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.