Dict
A dictionary mapping unique keys to values. The keys can be any comparable
type. This includes Int, Float, Time, Char and String.
Set, remove, and query operations all take O(log n) time.
A dictionary of keys and values. So a Dict String User is a dictionary
that lets you look up a String (such as user names) and find the associated
User.
import Dict exposing ( Dict )
users : Dict String User
users =
Dict.empty
|> Dict.set "Alice" (makeUser "Alice" 28 1.65)
|> Dict.set "Bob" (makeUser "Bob" 19 1.82)
|> Dict.set "Chuck" (makeUser "Chuck" 33 1.75)
type alias User =
{ name : String
, age : Int
, height : Float
}
makeUser : String -> Int -> Float -> User
makeUser name age height =
{ name = name
, age = age
, height = height
}
Create an empty dictionary.
Create a dictionary with one key-value pair.
Sets a value for a given key. Existing values will be replaced. If the key isn't already registered, the key-value pair will be inserted.
Update the value of a dictionary for a specific key with a given function.
Same as update but if the key doesn't exist in the dictionary, a default value
is passed to the provided update function instead of a Maybe.
Remove a key-value pair from a dictionary. If the key is not found, no changes are made.
Query
Determine if a dictionary is empty.
isEmpty empty == True
Determine the number of key-value pairs in the dictionary.
Get the value associated with a key. If the key is not found, return
Nothing. This is useful when you are not sure if a key will be in the
dictionary.
animals = Dict.empty |> Dict.set "Tom" Cat |> Dict.set "Jerry" Mouse
get "Tom" animals == Just Cat
get "Jerry" animals == Just Mouse
get "Spike" animals == Nothing
Determine if a key is in a dictionary.
Retrieve the first, or lowest, key-value pair.
Retrieve the last, or highest, key-value pair.
Find the first key-value pair that passes the test.
Find the last key-value pair that passes the test.
Checks if any key-value pair in the dictionary passes the test.
Checks if all key-value pairs in the dictionary passes the test.
Arrays
Get all of the keys in a dictionary, sorted from lowest to highest.
keys (Dict.empty |> Dict.set 0 "Alice" |> Dict.set 1 "Bob") == [ 0, 1 ]
Get all of the values in a dictionary, in the order of their keys.
values (Dict.empty |> Dict.set 0 "Alice" |> Dict.set 1 "Bob") == [ "Alice", "Bob" ]
Transform
Apply a function to all values in a dictionary.
Fold over the key-value pairs in a dictionary from lowest key to highest key.
import Dict exposing (Dict)
getAges : Dict String User -> Array String
getAges users =
Dict.foldl addAge [] users
addAge : String -> User -> Array String -> Array String
addAge _ user ages =
user.age :: ages
-- getAges users == [33,19,28]
Fold over the key-value pairs in a dictionary from highest key to lowest key.
import Dict exposing (Dict)
getAges : Dict String User -> Array String
getAges users =
Dict.foldr addAge [] users
addAge : String -> User -> Array String -> Array String
addAge _ user ages =
user.age :: ages
-- getAges users == [28,19,33]
Keep only the key-value pairs that pass the given test.
Remove unwanted results of a map operation.
Partition a dictionary according to some test. The first dictionary contains all key-value pairs which passed the test, and the second contains the pairs that did not.
Combine
Combine two dictionaries. If there is a collision, preference is given to the first dictionary.
Keep a key-value pair when its key appears in the second dictionary. Preference is given to values in the first dictionary.
Keep a key-value pair when its key does not appear in the second dictionary.
The most general way of combining two dictionaries. You provide three accumulators for when a given key appears:
- Only in the left dictionary.
- In both dictionaries.
- Only in the right dictionary. You then traverse all the keys from lowest to highest, building up whatever you want.