module Language.Primitives.Map where import qualified Data.Map.Strict as M import Language.Primitives.Io import Language.Primitives.IoAble import Language.Error newtype UnifiedMap a = UnifiedMap (M.Map a a) data PrimitiveMap a = IoMap Io | StandardMap (M.Map a a) deriving (Eq, Show, Ord) lookup :: Ord a => a -> PrimitiveMap a -> Maybe a lookup key (StandardMap map) = M.lookup key map lookup _ (IoMap Io) = Nothing findWithDefault :: Ord a => a -> a -> PrimitiveMap a -> a findWithDefault def key (StandardMap map) = M.findWithDefault def key map findWithDefault _ _ (IoMap Io) = undefined insert :: (IoAble a, Ord a) => a -> a -> PrimitiveMap a -> PrimitiveMap a insert key value (StandardMap map) = StandardMap $ M.insert key value map insert key value (IoMap Io) = seq (ioInsert key value) (IoMap Io)