module ProAbstract.Metadata.MetadataType
    ( Metadata (..)
    ) where

{- | A set of properties and settings, associated with a document or tag.

The namespaces of properties and settings are distinct; a property can share a name with a setting without conflict.
-}
data Metadata = Metadata
    { Metadata -> Set Text
metadataProperties :: Set Text      -- ^ 'ProAbstract.properties'
    , Metadata -> Map Text Text
metadataSettings   :: Map Text Text -- ^ 'ProAbstract.settings'
    }
  deriving stock (Metadata -> Metadata -> Bool
(Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool) -> Eq Metadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Metadata -> Metadata -> Bool
$c/= :: Metadata -> Metadata -> Bool
== :: Metadata -> Metadata -> Bool
$c== :: Metadata -> Metadata -> Bool
Eq, Int -> Metadata -> ShowS
[Metadata] -> ShowS
Metadata -> String
(Int -> Metadata -> ShowS)
-> (Metadata -> String) -> ([Metadata] -> ShowS) -> Show Metadata
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Metadata] -> ShowS
$cshowList :: [Metadata] -> ShowS
show :: Metadata -> String
$cshow :: Metadata -> String
showsPrec :: Int -> Metadata -> ShowS
$cshowsPrec :: Int -> Metadata -> ShowS
Show, (forall x. Metadata -> Rep Metadata x)
-> (forall x. Rep Metadata x -> Metadata) -> Generic Metadata
forall x. Rep Metadata x -> Metadata
forall x. Metadata -> Rep Metadata x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Metadata x -> Metadata
$cfrom :: forall x. Metadata -> Rep Metadata x
Generic)
  deriving anyclass (Metadata -> ()
(Metadata -> ()) -> NFData Metadata
forall a. (a -> ()) -> NFData a
rnf :: Metadata -> ()
$crnf :: Metadata -> ()
NFData, Eq Metadata
Eq Metadata
-> (Int -> Metadata -> Int)
-> (Metadata -> Int)
-> Hashable Metadata
Int -> Metadata -> Int
Metadata -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: Metadata -> Int
$chash :: Metadata -> Int
hashWithSalt :: Int -> Metadata -> Int
$chashWithSalt :: Int -> Metadata -> Int
$cp1Hashable :: Eq Metadata
Hashable)

instance Monoid Metadata where
    mempty :: Metadata
mempty = Set Text -> Map Text Text -> Metadata
Metadata Set Text
forall a. Monoid a => a
mempty Map Text Text
forall a. Monoid a => a
mempty

instance Semigroup Metadata where
    Metadata Set Text
p1 Map Text Text
s1 <> :: Metadata -> Metadata -> Metadata
<> Metadata Set Text
p2 Map Text Text
s2 = Set Text -> Map Text Text -> Metadata
Metadata (Set Text
p1 Set Text -> Set Text -> Set Text
forall a. Semigroup a => a -> a -> a
<> Set Text
p2) (Map Text Text
s1 Map Text Text -> Map Text Text -> Map Text Text
forall a. Semigroup a => a -> a -> a
<> Map Text Text
s2)