.TH dict 3erl "stdlib 5.2.2" "Ericsson AB" "Erlang Module Definition" .SH NAME dict \- Key-value dictionary. .SH DESCRIPTION .LP This module provides a \fIKey\fR\&-\fIValue\fR\& dictionary\&. The representation of a dictionary is not defined\&. .LP This module provides the same interface as the \fIorddict(3erl)\fR\& module\&. One difference is that while this module considers two keys as different if they do not match (\fI=:=\fR\&), \fIorddict\fR\& considers two keys as different if and only if they do not compare equal (\fI==\fR\&)\&. .SH DATA TYPES .nf \fBdict(Key, Value)\fR\& .br .fi .RS .LP Dictionary as returned by \fInew/0\fR\&\&. .RE .nf \fBdict()\fR\& = dict(term(), term()) .br .fi .SH EXPORTS .LP .nf .B append(Key, Value, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br .RE .RE .RS .LP Appends a new \fIValue\fR\& to the current list of values associated with \fIKey\fR\&\&. .LP See also section Notes\&. .RE .LP .nf .B append_list(Key, ValList, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br ValList = [Value] .br .RE .RE .RS .LP Appends a list of values \fIValList\fR\& to the current list of values associated with \fIKey\fR\&\&. An exception is generated if the initial value associated with \fIKey\fR\& is not a list of values\&. .LP See also section Notes\&. .RE .LP .nf .B erase(Key, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br .RE .RE .RS .LP Erases all items with a given key from a dictionary\&. .RE .LP .nf .B fetch(Key, Dict) -> Value .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value) .br .RE .RE .RS .LP Returns the value associated with \fIKey\fR\& in dictionary \fIDict\fR\&\&. This function assumes that \fIKey\fR\& is present in dictionary \fIDict\fR\&, and an exception is generated if \fIKey\fR\& is not in the dictionary\&. .LP See also section Notes\&. .RE .LP .nf .B fetch_keys(Dict) -> Keys .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value :: term()) .br Keys = [Key] .br .RE .RE .RS .LP Returns a list of all keys in dictionary \fIDict\fR\&\&. .RE .LP .nf .B take(Key, Dict) -> {Value, Dict1} | error .br .fi .br .RS .LP Types: .RS 3 Dict = Dict1 = dict(Key, Value) .br Key = Value = term() .br .RE .RE .RS .LP This function returns value from dictionary and a new dictionary without this value\&. Returns \fIerror\fR\& if the key is not present in the dictionary\&. .RE .LP .nf .B filter(Pred, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Pred = fun((Key, Value) -> boolean()) .br Dict1 = Dict2 = dict(Key, Value) .br .RE .RE .RS .LP \fIDict2\fR\& is a dictionary of all keys and values in \fIDict1\fR\& for which \fIPred(Key, Value)\fR\& is \fItrue\fR\&\&. .RE .LP .nf .B find(Key, Dict) -> {ok, Value} | error .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value) .br .RE .RE .RS .LP Searches for a key in dictionary \fIDict\fR\&\&. Returns \fI{ok, Value}\fR\&, where \fIValue\fR\& is the value associated with \fIKey\fR\&, or \fIerror\fR\& if the key is not present in the dictionary\&. .LP See also section Notes\&. .RE .LP .nf .B fold(Fun, Acc0, Dict) -> Acc1 .br .fi .br .RS .LP Types: .RS 3 Fun = fun((Key, Value, AccIn) -> AccOut) .br Dict = dict(Key, Value) .br Acc0 = Acc1 = AccIn = AccOut = Acc .br .RE .RE .RS .LP Calls \fIFun\fR\& on successive keys and values of dictionary \fIDict\fR\& together with an extra argument \fIAcc\fR\& (short for accumulator)\&. \fIFun\fR\& must return a new accumulator that is passed to the next call\&. \fIAcc0\fR\& is returned if the dictionary is empty\&. The evaluation order is undefined\&. .RE .LP .nf .B from_list(List) -> Dict .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value) .br List = [{Key, Value}] .br .RE .RE .RS .LP Converts the \fIKey\fR\&-\fIValue\fR\& list \fIList\fR\& to dictionary \fIDict\fR\&\&. .RE .LP .nf .B is_empty(Dict) -> boolean() .br .fi .br .RS .LP Types: .RS 3 Dict = dict() .br .RE .RE .RS .LP Returns \fItrue\fR\& if dictionary \fIDict\fR\& has no elements, otherwise \fIfalse\fR\&\&. .RE .LP .nf .B is_key(Key, Dict) -> boolean() .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value :: term()) .br .RE .RE .RS .LP Tests if \fIKey\fR\& is contained in dictionary \fIDict\fR\&\&. .RE .LP .nf .B map(Fun, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Fun = fun((Key, Value1) -> Value2) .br Dict1 = dict(Key, Value1) .br Dict2 = dict(Key, Value2) .br .RE .RE .RS .LP Calls \fIFun\fR\& on successive keys and values of dictionary \fIDict1\fR\& to return a new value for each key\&. The evaluation order is undefined\&. .RE .LP .nf .B merge(Fun, Dict1, Dict2) -> Dict3 .br .fi .br .RS .LP Types: .RS 3 Fun = fun((Key, Value1, Value2) -> Value) .br Dict1 = dict(Key, Value1) .br Dict2 = dict(Key, Value2) .br Dict3 = dict(Key, Value) .br .RE .RE .RS .LP Merges two dictionaries, \fIDict1\fR\& and \fIDict2\fR\&, to create a new dictionary\&. All the \fIKey\fR\&-\fIValue\fR\& pairs from both dictionaries are included in the new dictionary\&. If a key occurs in both dictionaries, \fIFun\fR\& is called with the key and both values to return a new value\&. \fImerge\fR\& can be defined as follows, but is faster: .LP .nf merge(Fun, D1, D2) -> fold(fun (K, V1, D) -> update(K, fun (V2) -> Fun(K, V1, V2) end, V1, D) end, D2, D1). .fi .RE .LP .nf .B new() -> dict() .br .fi .br .RS .LP Creates a new dictionary\&. .RE .LP .nf .B size(Dict) -> integer() >= 0 .br .fi .br .RS .LP Types: .RS 3 Dict = dict() .br .RE .RE .RS .LP Returns the number of elements in dictionary \fIDict\fR\&\&. .RE .LP .nf .B store(Key, Value, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br .RE .RE .RS .LP Stores a \fIKey\fR\&-\fIValue\fR\& pair in dictionary \fIDict2\fR\&\&. If \fIKey\fR\& already exists in \fIDict1\fR\&, the associated value is replaced by \fIValue\fR\&\&. .RE .LP .nf .B to_list(Dict) -> List .br .fi .br .RS .LP Types: .RS 3 Dict = dict(Key, Value) .br List = [{Key, Value}] .br .RE .RE .RS .LP Converts dictionary \fIDict\fR\& to a list representation\&. .RE .LP .nf .B update(Key, Fun, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br Fun = fun((Value1 :: Value) -> Value2 :: Value) .br .RE .RE .RS .LP Updates a value in a dictionary by calling \fIFun\fR\& on the value to get a new value\&. An exception is generated if \fIKey\fR\& is not present in the dictionary\&. .RE .LP .nf .B update(Key, Fun, Initial, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br Fun = fun((Value1 :: Value) -> Value2 :: Value) .br Initial = Value .br .RE .RE .RS .LP Updates a value in a dictionary by calling \fIFun\fR\& on the value to get a new value\&. If \fIKey\fR\& is not present in the dictionary, \fIInitial\fR\& is stored as the first value\&. For example, \fIappend/3\fR\& can be defined as: .LP .nf append(Key, Val, D) -> update(Key, fun (Old) -> Old ++ [Val] end, [Val], D). .fi .RE .LP .nf .B update_counter(Key, Increment, Dict1) -> Dict2 .br .fi .br .RS .LP Types: .RS 3 Dict1 = Dict2 = dict(Key, Value) .br Increment = number() .br .RE .RE .RS .LP Adds \fIIncrement\fR\& to the value associated with \fIKey\fR\& and stores this value\&. If \fIKey\fR\& is not present in the dictionary, \fIIncrement\fR\& is stored as the first value\&. .LP This can be defined as follows, but is faster: .LP .nf update_counter(Key, Incr, D) -> update(Key, fun (Old) -> Old + Incr end, Incr, D). .fi .RE .SH "NOTES" .LP Functions \fIappend\fR\& and \fIappend_list\fR\& are included so that keyed values can be stored in a list \fIaccumulator\fR\&, for example: .LP .nf > D0 = dict:new(), D1 = dict:store(files, [], D0), D2 = dict:append(files, f1, D1), D3 = dict:append(files, f2, D2), D4 = dict:append(files, f3, D3), dict:fetch(files, D4). [f1,f2,f3] .fi .LP This saves the trouble of first fetching a keyed value, appending a new value to the list of stored values, and storing the result\&. .LP Function \fIfetch\fR\& is to be used if the key is known to be in the dictionary, otherwise function \fIfind\fR\&\&. .SH "SEE ALSO" .LP \fIgb_trees(3erl)\fR\&, \fIorddict(3erl)\fR\&