parent $libraries object $dictionary var $root child_index 0 var $root owners [$dictionary] var $root fertile 0 var $root inited 1 var $root owned [$dictionary] var $root manager $dictionary var $root writable [$dictionary] var $root readable ['parameters, 'methods, 'code] var $root dbref 'dictionary method map_method arg ls, what; var x, dict; // args[1] == list of objects // args[2] == symbol for method on objects // it will create a dictionary out of the two. dict = #[]; // Get list's method(whatever) and add it to the dictionary for x in [1 .. listlen(ls)] dict = dict_add(dict, ls[x], (ls[x]).(what)()); return dict; . method merge arg [args]; var x, dict, z, tule, dz, axz, keys; // merges all dictionaries into a single one, if they have the same key's -- // basing off of args[1] (this should be the longest list (i know, bad Lynx). dict = args[1]; keys = dict_keys(args[1]); for x in [2 .. listlen(args)] { for z in (keys) { dz = dict[z]; axz = (args[x])[z]; if (type(dict[z]) == 'list) tule = dz; else tule = [dz]; tule = [@tule, axz]; dict = dict_add(dict, z, tule); } } return dict; . method to_list arg dict; var list, x, k; // merges into an associated list. k = dict_keys(dict); list = []; for x in (k) list = [@list, [x, dict[x]]]; return list; . method merge_to_list arg [args]; var x, dict, z, tule, dz, axz, keys, list; // merges all dictionaries into a single list, where each related key // is merged with all it's other values as a sublist // basing off of args[1] (this should be the longest list (i know, bad Lynx). dict = .merge(@args); list = []; for z in (dict_keys(dict)) list = [@list, dict[z]]; return list; . method union arg dict1, dict2; var key; // like union() but for dictionaries. adds any keys from dict2 that don't // already exist in dict1 to dict1 and returns the result. Order of keys in // result is not guaranteed. for key in (dict1) dict2 = dict_add(dict2, key[1], key[2]); return dict2; . method values arg dict; var list, x, k; // returns values same as dict_keys() returns keys. k = dict_keys(dict); list = []; for x in (k) list = [@list, dict[x]]; return list; . method replace arg dict, key, value; dict = (> dict_del(dict, key) <); dict = (> dict_add(dict, key, value) <); return dict; . method apply arg tdict, list; var x; // Apply a translation-dict to a list for x in [1 .. listlen(list)] { catch ~keynf { list = replace(list, x, tdict[list[x]]); } } return list; . method apply_to_keys arg tdict, dict; var x, newdict; // Apply a t-dict to the keys of a dict newdict = #[]; for x in (dict) { catch ~keynf { x = replace(x, 1, tdict[x[1]]); } newdict = dict_add(newdict, @x); } return newdict; . method apply_to_values arg tdict, dict; var x, newdict; // Apply a t-dict to the values of a dict newdict = #[]; for x in (dict) { catch ~keynf { x = replace(x, 2, tdict[x[2]]); } newdict = dict_add(newdict, @x); } return newdict; . method invert arg dict; var inverted, x; // Invert a dict (keys<->values) inverted = #[]; for x in (dict_keys(dict)) inverted = dict_add(inverted, dict[x], x); return inverted; . method add_elem arg dict, key, elem; var value; // same as old dict_add_elem value = (| dict[key] |); if ((type(value) != 'list) && (type(value) != 'error)) throw(~type, ((("Value for key " + ($data.unparse(key))) + " (") + ($data.unparse(value))) + ") is not a list."); if (value) value = [@value, elem]; else value = [elem]; return dict_add(dict, key, value); . method del_elem arg dict, key, elem; var value; value = (| dict[key] |); if ((type(value) != 'list) && (type(value) != 'error)) throw(~type, ((("Value for key " + ($data.unparse(key))) + " (") + ($data.unparse(value))) + ") is not a list."); value = setremove(value, elem); if (!value) return dict_del(dict, key); return dict_add(dict, key, value); . method add arg [args]; return (> dict_add(@args) <); . method del arg [args]; return (> dict_del(@args) <); . method keys arg [args]; return (> dict_keys(@args) <); .