content: -- ------------------------------------------------------------
  
  {- |
     Module     : Data.AssocList
     Copyright  : Copyright (C) 2010 Uwe Schmidt
     License    : MIT
  
     Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
     Stability  : stable
     Portability: portable
  
     Simple key value assocciation list
     implemented as unordered list of pairs
  
  -}
  
  -- ------------------------------------------------------------
  
  module Data.AssocList
      ( module 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
  
  -- -----------------------------------------------------------------------------
  
  
  