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