module ProAbstract.Tag.TagType
    ( Tag (..)
    )
    where

import ProAbstract.Annotation
import ProAbstract.Metadata

data Tag ann = Tag
    { Tag ann -> Text
tagName       :: Text     -- ^ 'ProAbstract.name'
    , Tag ann -> Metadata
tagMetadata   :: Metadata -- ^ 'ProAbstract.metadata'
    , Tag ann -> ann
tagAnnotation :: ann      -- ^ 'ProAbstract.annotation'
    }
  deriving stock (Tag ann -> Tag ann -> Bool
(Tag ann -> Tag ann -> Bool)
-> (Tag ann -> Tag ann -> Bool) -> Eq (Tag ann)
forall ann. Eq ann => Tag ann -> Tag ann -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Tag ann -> Tag ann -> Bool
$c/= :: forall ann. Eq ann => Tag ann -> Tag ann -> Bool
== :: Tag ann -> Tag ann -> Bool
$c== :: forall ann. Eq ann => Tag ann -> Tag ann -> Bool
Eq, Int -> Tag ann -> ShowS
[Tag ann] -> ShowS
Tag ann -> String
(Int -> Tag ann -> ShowS)
-> (Tag ann -> String) -> ([Tag ann] -> ShowS) -> Show (Tag ann)
forall ann. Show ann => Int -> Tag ann -> ShowS
forall ann. Show ann => [Tag ann] -> ShowS
forall ann. Show ann => Tag ann -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Tag ann] -> ShowS
$cshowList :: forall ann. Show ann => [Tag ann] -> ShowS
show :: Tag ann -> String
$cshow :: forall ann. Show ann => Tag ann -> String
showsPrec :: Int -> Tag ann -> ShowS
$cshowsPrec :: forall ann. Show ann => Int -> Tag ann -> ShowS
Show, (forall x. Tag ann -> Rep (Tag ann) x)
-> (forall x. Rep (Tag ann) x -> Tag ann) -> Generic (Tag ann)
forall x. Rep (Tag ann) x -> Tag ann
forall x. Tag ann -> Rep (Tag ann) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ann x. Rep (Tag ann) x -> Tag ann
forall ann x. Tag ann -> Rep (Tag ann) x
$cto :: forall ann x. Rep (Tag ann) x -> Tag ann
$cfrom :: forall ann x. Tag ann -> Rep (Tag ann) x
Generic)
  deriving anyclass (Eq (Tag ann)
Eq (Tag ann)
-> (Int -> Tag ann -> Int)
-> (Tag ann -> Int)
-> Hashable (Tag ann)
Int -> Tag ann -> Int
Tag ann -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
forall ann. Hashable ann => Eq (Tag ann)
forall ann. Hashable ann => Int -> Tag ann -> Int
forall ann. Hashable ann => Tag ann -> Int
hash :: Tag ann -> Int
$chash :: forall ann. Hashable ann => Tag ann -> Int
hashWithSalt :: Int -> Tag ann -> Int
$chashWithSalt :: forall ann. Hashable ann => Int -> Tag ann -> Int
$cp1Hashable :: forall ann. Hashable ann => Eq (Tag ann)
Hashable, Tag ann -> ()
(Tag ann -> ()) -> NFData (Tag ann)
forall ann. NFData ann => Tag ann -> ()
forall a. (a -> ()) -> NFData a
rnf :: Tag ann -> ()
$crnf :: forall ann. NFData ann => Tag ann -> ()
NFData)

type instance Annotation (Tag ann) = ann

instance HasAnnotation (Tag ann) (Tag ann') where
    annotation :: Lens
  (Tag ann) (Tag ann') (Annotation (Tag ann)) (Annotation (Tag ann'))
annotation = (Tag ann -> ann)
-> (Tag ann -> ann' -> Tag ann')
-> Lens (Tag ann) (Tag ann') ann ann'
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tag ann -> ann
forall ann. Tag ann -> ann
tagAnnotation \Tag ann
x ann'
a -> Tag ann
x{ tagAnnotation :: ann'
tagAnnotation = ann'
a }

instance HasMetadata (Tag ann) where
    type MetadataOpticKind (Tag ann) = A_Lens
    metadata :: Optic' (MetadataOpticKind (Tag ann)) NoIx (Tag ann) Metadata
metadata = (Tag ann -> Metadata)
-> (Tag ann -> Metadata -> Tag ann)
-> Lens (Tag ann) (Tag ann) Metadata Metadata
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tag ann -> Metadata
forall ann. Tag ann -> Metadata
tagMetadata (\Tag ann
d Metadata
m -> Tag ann
d { tagMetadata :: Metadata
tagMetadata = Metadata
m })