module Cgm.Data.MapMultiset(
MapMultiset(mapMultisetMap)
) where
import Prelude()
import Cgm.Prelude
import Cgm.Data.Maybe
import Cgm.Data.Multiset
import Cgm.Data.Typeable
import Data.Map(Map)
import qualified Data.Map as Map
newtype MapMultiset a = MapMultiset {mapMultisetMap :: Map a Integer} deriving Typeable
instance Multiset MapMultiset where
emptySet = MapMultiset Map.empty
insert e (MapMultiset a) = MapMultiset $ Map.insertWith' (+) e 1 a
delete e (MapMultiset a) = fmap (\c -> MapMultiset $ if c == 1 then Map.delete e a else Map.insert e (c 1) a) $ Map.lookup e a
instance Ord a => Monoid (MapMultiset a) where
mempty = MapMultiset Map.empty
mappend (MapMultiset a) (MapMultiset b) = MapMultiset $ Map.unionWith (+) a b