new object $dictionary: $libraries;
var $root created_on = 796268969;
var $root flags = ['methods, 'code, 'variables, 'core];
var $root inited = 1;
var $root managed = [$dictionary];
var $root manager = $dictionary;
public method .add(): native;
public method .add_elem() {
arg dict, key, elem;
var value;
// Add an element to the list value of a dictionary key
value = (| dict[key] |);
if ((type(value) != 'list) && (type(value) != 'error))
throw(~type, ((("Value for key " + key) + " (") + value) + ") is not a list.");
anticipate_assignment();
if (value) {
// reduce references to 'value'
dict = dict_add(dict, key, 0);
value += [elem];
} else {
value = [elem];
}
return dict_add(dict, key, value);
};
public method .apply() {
arg tdict, list;
var x;
// Apply a translation-dict to a list
for x in [1 .. list.length()] {
catch ~keynf
list = list.replace(x, tdict[list[x]]);
}
return list;
};
public 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 = x.replace(1, tdict[x[1]]);
newdict = newdict.add(@x);
}
return newdict;
};
public 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 = x.replace(2, tdict[x[2]]);
newdict = newdict.add(@x);
}
return newdict;
};
public method .contains(): native;
public method .del(): native;
public method .del_elem() {
arg dict, key, elem;
var value;
value = (| dict[key] |);
if ((type(value) != 'list) && (type(value) != 'error))
throw(~type, ((("Value for key " + key) + " (") + value) + ") is not a list.");
anticipate_assignment();
dict = dict_add(dict, key, 0);
value = setremove(value, elem);
if (!value)
return dict_del(dict, key);
return dict_add(dict, key, value);
};
public method .invert() {
arg dict;
var x;
// Invert a dict keys and values
return hash x in (dict) to ([x[2], x[1]]);
};
public method .keys(): native;
public method .nunion() {
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.
if (((dict1.keys()).length()) < ((dict2.keys()).length())) {
for key in (dict1)
dict2 = dict_add(dict2, @key);
return dict2;
} else {
for key in (dict2)
dict1 = dict_add(dict1, @key);
return dict1;
}
};
public method .replace() {
arg dict, key, value;
// GOING AWAY!
anticipate_assignment();
return dict_add(dict, key, value);
};
public method .setadd_elem() {
arg dict, key, elem;
var value;
value = (| dict[key] |);
if ((type(value) != 'list) && (type(value) != 'error))
throw(~type, ((("Value for key " + key) + " (") + value) + ") is not a list.");
anticipate_assignment();
if (value) {
dict = dict_add(dict, key, 0);
value = setadd(value, elem);
} else {
value = [elem];
}
return dict_add(dict, key, value);
};
public method .to_list() {
arg dict;
var x;
// merges into an associated list.
return map x in (dict) to (x);
};
public method .to_trie() {
arg dict;
var i, trie;
trie = $trie.new();
for i in (dict) {
trie = trie.add(i[1], i[2]);
refresh();
}
return trie;
};
public method .union(): native;
public method .values(): native;