{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Gauge.ListMap
( Map
, fromList
, toList
, lookup
) where
import Data.Typeable
import GHC.Generics
import Prelude hiding (lookup)
import qualified Prelude as P
import Control.DeepSeq (NFData)
import Data.List hiding (lookup)
import Data.Function (on)
newtype Map k v = Map [(k,v)]
deriving (Show,Eq,Typeable,Generic, NFData)
fromList :: Ord k => [(k,v)] -> Map k v
fromList = Map . map head . groupBy ((==) `on` fst) . sortBy (compare `on` fst)
toList :: Map k v -> [(k,v)]
toList (Map l) = l
lookup :: Eq k => k -> Map k v -> Maybe v
lookup k (Map l) = P.lookup k l