yuuko-2010.11.28: src/Yuuko/Data/AssocList.hs
-- |
-- simple key value assocciation list
-- implemented as unordered list of pairs
--
-- Version : $Id: AssocList.hs,v 1.2 2005/05/27 13:15:23 hxml Exp $
module Yuuko.Data.AssocList
( module Yuuko.Data.AssocList
)
where
import Data.Maybe
type AssocList k v = [(k, v)]
-- lookup = lookup from Prelude
-- | lookup with default value
lookupDef :: Eq k => v -> k -> AssocList k v -> v
lookupDef d k = fromMaybe d . lookup k
-- | lookup with empty list (empty string) as default value
lookup1 :: Eq k => k -> AssocList k [e] -> [e]
lookup1 k = fromMaybe [] . lookup k
-- | test for existence of a key
hasEntry :: Eq k => k -> AssocList k v -> Bool
hasEntry k = isJust . lookup k
-- | add an entry, remove an existing entry before adding the new one at the top of the list, addEntry is strict
addEntry :: Eq k => k -> v -> AssocList k v -> AssocList k v
addEntry k v l = ( (k,v) : ) $! delEntry k l
-- let l' = delEntry k l in seq l' ((k, v) : l')
-- | add a whole list of entries with 'addEntry'
addEntries :: Eq k => AssocList k v -> AssocList k v -> AssocList k v
addEntries = foldr (.) id . map (uncurry addEntry) . reverse
-- | delete an entry, delEntry is strict
delEntry :: Eq k => k -> AssocList k v -> AssocList k v
delEntry _ [] = []
delEntry k (x@(k1,_) : rest)
| k == k1 = rest
| otherwise = ( x : ) $! delEntry k rest
-- delEntry k = filter ((/= k) . fst)
-- | delete a list of entries with 'delEntry'
delEntries :: Eq k => [k] -> AssocList k v -> AssocList k v
delEntries = foldl (.) id . map delEntry
-- -----------------------------------------------------------------------------