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