module Data.SemiMap where import Data.Map (Map) import qualified Data.Map as Map -- | A newtype around 'Map' which uses @'Map.unionWith' '(<>)'@ for the -- semigroup and monoid instance. -- -- @since 0.1.0.0 newtype SemiMap k v = SemiMap { unSemiMap :: Map k v } deriving (Eq, Ord, Show) instance (Ord k, Semigroup v) => Semigroup (SemiMap k v) where SemiMap m0 <> SemiMap m1 = SemiMap (Map.unionWith (<>) m0 m1) instance (Ord k, Semigroup v) => Monoid (SemiMap k v) where mempty = SemiMap mempty