module Language.Primitives.Map where import qualified Data.Map.Strict as M import Language.Primitives.Io import Language.Primitives.IoAble 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)