module Data.EnumIntMap(EnumIntMap, lookup, findWithDefault, (!), fromList, fromListBy, keys, elems, toList, empty, elementsFromMap) where
import Prelude hiding (lookup)
import Control.Arrow(first, (&&&))
import Data.Maybe(fromMaybe)
import qualified Data.IntMap as IntMap
import Data.IntMap(IntMap)
import Data.Monoid(Monoid(..))
import Control.DeepSeq (NFData, rnf)
newtype EnumIntMap k v = EnumIntMap { unEnumIntMap :: IntMap v }
deriving (Show, Read, Eq, Ord)
inEnumIntMap :: (IntMap v -> IntMap v') -> EnumIntMap k v -> EnumIntMap k v'
inEnumIntMap f = EnumIntMap . f . unEnumIntMap
inEnumIntMap2 :: (IntMap v -> IntMap v' -> IntMap v'') -> EnumIntMap k v -> EnumIntMap k v' -> EnumIntMap k v''
inEnumIntMap2 f = inEnumIntMap . f . unEnumIntMap
instance (Enum a, NFData b) => NFData (EnumIntMap a b) where
rnf = rnf . unEnumIntMap
instance Monoid (EnumIntMap k v) where
mempty = EnumIntMap mempty
mappend = inEnumIntMap2 mappend
empty :: Enum k => EnumIntMap k v
empty = mempty
lookup :: Enum k => k -> EnumIntMap k v -> Maybe v
k `lookup` EnumIntMap intMap = IntMap.lookup (fromEnum k) intMap
findWithDefault :: Enum k => v -> k -> EnumIntMap k v -> v
findWithDefault v k (EnumIntMap intMap) = IntMap.findWithDefault v (fromEnum k) intMap
(!) :: Enum k => EnumIntMap k v -> k -> v
em ! k = fromMaybe (error "EnumIntMap.! no such key") $ lookup k em
fromList :: Enum k => [(k, v)] -> EnumIntMap k v
fromList = EnumIntMap . IntMap.fromList . (map . first) fromEnum
fromListBy :: Enum k => (v -> k) -> [v] -> EnumIntMap k v
fromListBy f = fromList . map (f &&& id)
toList :: Enum k => EnumIntMap k v -> [(k, v)]
toList = (map . first) toEnum . IntMap.toList . unEnumIntMap
elems :: Enum k => EnumIntMap k v -> [v]
elems = map snd . toList
keys :: Enum k => EnumIntMap k v -> [k]
keys = map fst . toList
elementsFromMap :: (Enum k) => [k] -> EnumIntMap k b -> [b]
elementsFromMap ks m = map (m !) ks