1-- ------------------------------------------------------------
2
3{- |
4   Module     : Data.AssocList
5   Copyright  : Copyright (C) 2010 Uwe Schmidt
6   License    : MIT
7
8   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
9   Stability  : stable
10   Portability: portable
11
12   Simple key value assocciation list
13   implemented as unordered list of pairs
14
15-}
16
17-- ------------------------------------------------------------
18
19module Data.AssocList
20    ( module Data.AssocList
21    )
22where
23
24import Data.Maybe
25
26type AssocList k v = [(k, v)]
27
28-- lookup       = lookup from Prelude
29
30-- | lookup with default value
31
32lookupDef       :: Eq k => v -> k -> AssocList k v -> v
33lookupDef d k   = fromMaybe d . lookup k
34
35-- | lookup with empty list (empty string) as default value
36
37lookup1         :: Eq k => k -> AssocList k [e] -> [e]
38lookup1 k       = fromMaybe [] . lookup k
39
40-- | test for existence of a key
41
42hasEntry        :: Eq k => k -> AssocList k v -> Bool
43hasEntry k      = isJust . lookup k
44
45-- | add an entry, remove an existing entry before adding the new one at the top of the list, addEntry is strict
46
47addEntry        :: Eq k => k -> v -> AssocList k v -> AssocList k v
48addEntry k v l  = ( (k,v) : ) $! delEntry k l
49
50 -- let l' = delEntry k l in seq l' ((k, v) : l')
51
52-- | add a whole list of entries with 'addEntry'
53
54addEntries      :: Eq k => AssocList k v -> AssocList k v -> AssocList k v
55addEntries      = foldr (.) id . map (uncurry addEntry) . reverse
56
57-- | delete an entry, delEntry is strict
58delEntry        :: Eq k => k -> AssocList k v -> AssocList k v
59delEntry _ []   = []
60delEntry k (x@(k1,_) : rest)
61    | k == k1   = rest
62    | otherwise = ( x : ) $! delEntry k rest
63
64-- delEntry k   = filter ((/= k) . fst)
65
66-- | delete a list of entries with 'delEntry'
67
68delEntries      :: Eq k => [k] -> AssocList k v -> AssocList k v
69delEntries      = foldl (.) id . map delEntry
70
71-- -----------------------------------------------------------------------------
72
73
74