1{-# LANGUAGE DeriveGeneric #-} 2{-# LANGUAGE GeneralizedNewtypeDeriving #-} 3module Data.Monoid.Map where 4 5import qualified Data.Map as M 6import Stack.Prelude 7 8-- | Utility newtype wrapper to make make Map's Monoid also use the 9-- element's Monoid. 10newtype MonoidMap k a = MonoidMap (Map k a) 11 deriving (Eq, Ord, Read, Show, Generic, Functor) 12 13instance (Ord k, Semigroup a) => Semigroup (MonoidMap k a) where 14 MonoidMap mp1 <> MonoidMap mp2 = MonoidMap (M.unionWith (<>) mp1 mp2) 15 16instance (Ord k, Semigroup a) => Monoid (MonoidMap k a) where 17 mappend = (<>) 18 mempty = MonoidMap mempty 19