module ProAbstract.Structure.Fragment
    ( Fragment (..)
    ) where

import ProAbstract.Annotation
import ProAbstract.Content

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

type instance Annotation (Fragment ann) = ann

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

type instance Content (Fragment ann) = Text

instance HasContent (Fragment ann) (Fragment ann) where
    content :: Lens
  (Fragment ann)
  (Fragment ann)
  (Content (Fragment ann))
  (Content (Fragment ann))
content = (Fragment ann -> Text)
-> (Fragment ann -> Text -> Fragment ann)
-> Lens (Fragment ann) (Fragment ann) Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Fragment ann -> Text
forall ann. Fragment ann -> Text
fragmentText (\Fragment ann
f Text
t -> Fragment ann
f { fragmentText :: Text
fragmentText = Text
t })