module Data.Monoid.Map
  ( MonoidMap (..)
  ) where

import qualified Data.Map as M
import           Stack.Prelude

-- | Utility newtype wrapper to make Map's Monoid also use the

-- element's Monoid.

newtype MonoidMap k a
  = MonoidMap (Map k a)
  deriving (MonoidMap k a -> MonoidMap k a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k a. (Eq k, Eq a) => MonoidMap k a -> MonoidMap k a -> Bool
/= :: MonoidMap k a -> MonoidMap k a -> Bool
$c/= :: forall k a. (Eq k, Eq a) => MonoidMap k a -> MonoidMap k a -> Bool
== :: MonoidMap k a -> MonoidMap k a -> Bool
$c== :: forall k a. (Eq k, Eq a) => MonoidMap k a -> MonoidMap k a -> Bool
Eq, forall a b. a -> MonoidMap k b -> MonoidMap k a
forall a b. (a -> b) -> MonoidMap k a -> MonoidMap k b
forall k a b. a -> MonoidMap k b -> MonoidMap k a
forall k a b. (a -> b) -> MonoidMap k a -> MonoidMap k b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> MonoidMap k b -> MonoidMap k a
$c<$ :: forall k a b. a -> MonoidMap k b -> MonoidMap k a
fmap :: forall a b. (a -> b) -> MonoidMap k a -> MonoidMap k b
$cfmap :: forall k a b. (a -> b) -> MonoidMap k a -> MonoidMap k b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k a x. Rep (MonoidMap k a) x -> MonoidMap k a
forall k a x. MonoidMap k a -> Rep (MonoidMap k a) x
$cto :: forall k a x. Rep (MonoidMap k a) x -> MonoidMap k a
$cfrom :: forall k a x. MonoidMap k a -> Rep (MonoidMap k a) x
Generic, MonoidMap k a -> MonoidMap k a -> Bool
MonoidMap k a -> MonoidMap k a -> Ordering
MonoidMap k a -> MonoidMap k a -> MonoidMap k a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {k} {a}. (Ord k, Ord a) => Eq (MonoidMap k a)
forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Bool
forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Ordering
forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> MonoidMap k a
min :: MonoidMap k a -> MonoidMap k a -> MonoidMap k a
$cmin :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> MonoidMap k a
max :: MonoidMap k a -> MonoidMap k a -> MonoidMap k a
$cmax :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> MonoidMap k a
>= :: MonoidMap k a -> MonoidMap k a -> Bool
$c>= :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Bool
> :: MonoidMap k a -> MonoidMap k a -> Bool
$c> :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Bool
<= :: MonoidMap k a -> MonoidMap k a -> Bool
$c<= :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Bool
< :: MonoidMap k a -> MonoidMap k a -> Bool
$c< :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Bool
compare :: MonoidMap k a -> MonoidMap k a -> Ordering
$ccompare :: forall k a.
(Ord k, Ord a) =>
MonoidMap k a -> MonoidMap k a -> Ordering
Ord, ReadPrec [MonoidMap k a]
ReadPrec (MonoidMap k a)
ReadS [MonoidMap k a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k a. (Ord k, Read k, Read a) => ReadPrec [MonoidMap k a]
forall k a. (Ord k, Read k, Read a) => ReadPrec (MonoidMap k a)
forall k a. (Ord k, Read k, Read a) => Int -> ReadS (MonoidMap k a)
forall k a. (Ord k, Read k, Read a) => ReadS [MonoidMap k a]
readListPrec :: ReadPrec [MonoidMap k a]
$creadListPrec :: forall k a. (Ord k, Read k, Read a) => ReadPrec [MonoidMap k a]
readPrec :: ReadPrec (MonoidMap k a)
$creadPrec :: forall k a. (Ord k, Read k, Read a) => ReadPrec (MonoidMap k a)
readList :: ReadS [MonoidMap k a]
$creadList :: forall k a. (Ord k, Read k, Read a) => ReadS [MonoidMap k a]
readsPrec :: Int -> ReadS (MonoidMap k a)
$creadsPrec :: forall k a. (Ord k, Read k, Read a) => Int -> ReadS (MonoidMap k a)
Read, Int -> MonoidMap k a -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k a. (Show k, Show a) => Int -> MonoidMap k a -> ShowS
forall k a. (Show k, Show a) => [MonoidMap k a] -> ShowS
forall k a. (Show k, Show a) => MonoidMap k a -> String
showList :: [MonoidMap k a] -> ShowS
$cshowList :: forall k a. (Show k, Show a) => [MonoidMap k a] -> ShowS
show :: MonoidMap k a -> String
$cshow :: forall k a. (Show k, Show a) => MonoidMap k a -> String
showsPrec :: Int -> MonoidMap k a -> ShowS
$cshowsPrec :: forall k a. (Show k, Show a) => Int -> MonoidMap k a -> ShowS
Show)

instance (Ord k, Semigroup a) => Semigroup (MonoidMap k a) where
  MonoidMap Map k a
mp1 <> :: MonoidMap k a -> MonoidMap k a -> MonoidMap k a
<> MonoidMap Map k a
mp2 = forall k a. Map k a -> MonoidMap k a
MonoidMap (forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
M.unionWith forall a. Semigroup a => a -> a -> a
(<>) Map k a
mp1 Map k a
mp2)

instance (Ord k, Semigroup a) => Monoid (MonoidMap k a) where
  mappend :: MonoidMap k a -> MonoidMap k a -> MonoidMap k a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
  mempty :: MonoidMap k a
mempty = forall k a. Map k a -> MonoidMap k a
MonoidMap forall a. Monoid a => a
mempty