packages feed

EnumContainers-0.1: src/Data/EnumIntMap.hs

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