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 { SemiMap k v -> Map k v
unSemiMap :: Map k v }
  deriving (SemiMap k v -> SemiMap k v -> Bool
(SemiMap k v -> SemiMap k v -> Bool)
-> (SemiMap k v -> SemiMap k v -> Bool) -> Eq (SemiMap k v)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k v. (Eq k, Eq v) => SemiMap k v -> SemiMap k v -> Bool
/= :: SemiMap k v -> SemiMap k v -> Bool
$c/= :: forall k v. (Eq k, Eq v) => SemiMap k v -> SemiMap k v -> Bool
== :: SemiMap k v -> SemiMap k v -> Bool
$c== :: forall k v. (Eq k, Eq v) => SemiMap k v -> SemiMap k v -> Bool
Eq, Eq (SemiMap k v)
Eq (SemiMap k v)
-> (SemiMap k v -> SemiMap k v -> Ordering)
-> (SemiMap k v -> SemiMap k v -> Bool)
-> (SemiMap k v -> SemiMap k v -> Bool)
-> (SemiMap k v -> SemiMap k v -> Bool)
-> (SemiMap k v -> SemiMap k v -> Bool)
-> (SemiMap k v -> SemiMap k v -> SemiMap k v)
-> (SemiMap k v -> SemiMap k v -> SemiMap k v)
-> Ord (SemiMap k v)
SemiMap k v -> SemiMap k v -> Bool
SemiMap k v -> SemiMap k v -> Ordering
SemiMap k v -> SemiMap k v -> SemiMap k v
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 v. (Ord k, Ord v) => Eq (SemiMap k v)
forall k v. (Ord k, Ord v) => SemiMap k v -> SemiMap k v -> Bool
forall k v.
(Ord k, Ord v) =>
SemiMap k v -> SemiMap k v -> Ordering
forall k v.
(Ord k, Ord v) =>
SemiMap k v -> SemiMap k v -> SemiMap k v
min :: SemiMap k v -> SemiMap k v -> SemiMap k v
$cmin :: forall k v.
(Ord k, Ord v) =>
SemiMap k v -> SemiMap k v -> SemiMap k v
max :: SemiMap k v -> SemiMap k v -> SemiMap k v
$cmax :: forall k v.
(Ord k, Ord v) =>
SemiMap k v -> SemiMap k v -> SemiMap k v
>= :: SemiMap k v -> SemiMap k v -> Bool
$c>= :: forall k v. (Ord k, Ord v) => SemiMap k v -> SemiMap k v -> Bool
> :: SemiMap k v -> SemiMap k v -> Bool
$c> :: forall k v. (Ord k, Ord v) => SemiMap k v -> SemiMap k v -> Bool
<= :: SemiMap k v -> SemiMap k v -> Bool
$c<= :: forall k v. (Ord k, Ord v) => SemiMap k v -> SemiMap k v -> Bool
< :: SemiMap k v -> SemiMap k v -> Bool
$c< :: forall k v. (Ord k, Ord v) => SemiMap k v -> SemiMap k v -> Bool
compare :: SemiMap k v -> SemiMap k v -> Ordering
$ccompare :: forall k v.
(Ord k, Ord v) =>
SemiMap k v -> SemiMap k v -> Ordering
$cp1Ord :: forall k v. (Ord k, Ord v) => Eq (SemiMap k v)
Ord, Int -> SemiMap k v -> ShowS
[SemiMap k v] -> ShowS
SemiMap k v -> String
(Int -> SemiMap k v -> ShowS)
-> (SemiMap k v -> String)
-> ([SemiMap k v] -> ShowS)
-> Show (SemiMap k v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k v. (Show k, Show v) => Int -> SemiMap k v -> ShowS
forall k v. (Show k, Show v) => [SemiMap k v] -> ShowS
forall k v. (Show k, Show v) => SemiMap k v -> String
showList :: [SemiMap k v] -> ShowS
$cshowList :: forall k v. (Show k, Show v) => [SemiMap k v] -> ShowS
show :: SemiMap k v -> String
$cshow :: forall k v. (Show k, Show v) => SemiMap k v -> String
showsPrec :: Int -> SemiMap k v -> ShowS
$cshowsPrec :: forall k v. (Show k, Show v) => Int -> SemiMap k v -> ShowS
Show)

instance (Ord k, Semigroup v) => Semigroup (SemiMap k v) where
  SemiMap Map k v
m0 <> :: SemiMap k v -> SemiMap k v -> SemiMap k v
<> SemiMap Map k v
m1 = Map k v -> SemiMap k v
forall k v. Map k v -> SemiMap k v
SemiMap ((v -> v -> v) -> Map k v -> Map k v -> Map k v
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith v -> v -> v
forall a. Semigroup a => a -> a -> a
(<>) Map k v
m0 Map k v
m1)

instance (Ord k, Semigroup v) => Monoid (SemiMap k v) where
  mempty :: SemiMap k v
mempty = Map k v -> SemiMap k v
forall k v. Map k v -> SemiMap k v
SemiMap Map k v
forall a. Monoid a => a
mempty