module Database.Perdure.Data.MapMultiset(
MapMultiset(mapMultisetMap),
module Cgm.Data.Multiset
) where
import Prelude()
import Cgm.Prelude
import Cgm.Data.Multiset
import Database.Perdure.Persistent
import Cgm.Control.Monad.State
import Database.Perdure.Data.Map(Map)
import qualified Database.Perdure.Data.Map as Map
import Data.Dynamic
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 MapMultiset $ snd $ flip runState a $ Map.updateM e $
get >>= maybe (return ()) (\c -> if c == 1 then put Nothing else put $ Just $ c 1)
instance (Typeable a, Persistent a) => Persistent (MapMultiset a) where persister = structureMap persister
deriveStructured ''MapMultiset