nri-prelude-0.1.0.1: A Prelude inspired by the Elm programming language

Safe HaskellNone
LanguageHaskell2010

Dict

Contents

Description

A dictionary mapping unique keys to values. The keys can be any comparable type. This includes Int, Float, Time, Char, String, and tuples or lists of comparable types.

Insert, remove, and query operations all take _O(log n)_ time.

Synopsis

Dictionaries

type Dict k v = Map k v Source #

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.fromList
    [ ("Alice", User "Alice" 28 1.65)
    , ("Bob"  , User "Bob"   19 1.82)
    , ("Chuck", User "Chuck" 33 1.75)
    ]

type alias User =
  { name : String
  , age : Int
  , height : Float
  }

Build

empty :: Dict k v Source #

Create an empty dictionary.

singleton :: comparable -> v -> Dict comparable v Source #

Create a dictionary with one key-value pair.

insert :: Ord comparable => comparable -> v -> Dict comparable v -> Dict comparable v Source #

Insert a key-value pair into a dictionary. Replaces value when there is a collision.

update :: Ord comparable => comparable -> (Maybe v -> Maybe v) -> Dict comparable v -> Dict comparable v Source #

Update the value of a dictionary for a specific key with a given function.

remove :: Ord comparable => comparable -> Dict comparable v -> Dict comparable v Source #

Remove a key-value pair from a dictionary. If the key is not found, no changes are made.

Query

isEmpty :: Dict k v -> Bool Source #

Determine if a dictionary is empty.

isEmpty empty == True

member :: Ord comparable => comparable -> Dict comparable v -> Bool Source #

Determine if a key is in a dictionary.

get :: Ord comparable => comparable -> Dict comparable v -> Maybe v Source #

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 = fromList [ ("Tom", Cat), ("Jerry", Mouse) ]

get "Tom"   animals == Just Cat
get "Jerry" animals == Just Mouse
get "Spike" animals == Nothing

size :: Dict k v -> Int Source #

Determine the number of key-value pairs in the dictionary.

Lists

keys :: Dict k v -> List k Source #

Get all of the keys in a dictionary, sorted from lowest to highest.

keys (fromList [(0,"Alice"),(1,"Bob")]) == [0,1]

values :: Dict k v -> List v Source #

Get all of the values in a dictionary, in the order of their keys.

values (fromList [(0,"Alice"),(1,"Bob")]) == ["Alice", "Bob"]

toList :: Dict k v -> List (k, v) Source #

Convert a dictionary into an association list of key-value pairs, sorted by keys.

fromList :: Ord comparable => List (comparable, v) -> Dict comparable v Source #

Convert an association list into a dictionary.

Transform

map :: (k -> a -> b) -> Dict k a -> Dict k b Source #

Apply a function to all values in a dictionary.

foldl :: (k -> v -> b -> b) -> b -> Dict k v -> b Source #

Fold over the key-value pairs in a dictionary from lowest key to highest key.

import Dict exposing (Dict)

getAges : Dict String User -> List String
getAges users =
  Dict.foldl addAge [] users

addAge : String -> User -> List String -> List String
addAge _ user ages =
  user.age :: ages

-- getAges users == [33,19,28]

foldr :: (k -> v -> b -> b) -> b -> Dict k v -> b Source #

Fold over the key-value pairs in a dictionary from highest key to lowest key.

import Dict exposing (Dict)

getAges : Dict String User -> List String
getAges users =
  Dict.foldr addAge [] users

addAge : String -> User -> List String -> List String
addAge _ user ages =
  user.age :: ages

-- getAges users == [28,19,33]

filter :: (comparable -> v -> Bool) -> Dict comparable v -> Dict comparable v Source #

Keep only the key-value pairs that pass the given test.

partition :: (comparable -> v -> Bool) -> Dict comparable v -> (Dict comparable v, Dict comparable v) Source #

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

union :: Ord comparable => Dict comparable v -> Dict comparable v -> Dict comparable v Source #

Combine two dictionaries. If there is a collision, preference is given to the first dictionary.

intersect :: Ord comparable => Dict comparable v -> Dict comparable v -> Dict comparable v Source #

Keep a key-value pair when its key appears in the second dictionary. Preference is given to values in the first dictionary.

diff :: Ord comparable => Dict comparable a -> Dict comparable b -> Dict comparable a Source #

Keep a key-value pair when its key does not appear in the second dictionary.

merge :: Ord comparable => (comparable -> a -> result -> result) -> (comparable -> a -> b -> result -> result) -> (comparable -> b -> result -> result) -> Dict comparable a -> Dict comparable b -> result -> result Source #

The most general way of combining two dictionaries. You provide three accumulators for when a given key appears:

  1. Only in the left dictionary.
  2. In both dictionaries.
  3. Only in the right dictionary.

You then traverse all the keys from lowest to highest, building up whatever you want.