module ProAbstract.Structure.PlainBlock
    ( PlainBlock (..), Tagged (..)
    ) where

import ProAbstract.Annotation
import ProAbstract.Content
import ProAbstract.Metadata
import ProAbstract.Structure.Fragment
import ProAbstract.Tag


-- ⭐ PlainBlock

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

type instance Contents (PlainBlock ann) = Fragment ann

instance HasContents (PlainBlock ann) (PlainBlock ann) where
    contents :: Lens
  (PlainBlock ann)
  (PlainBlock ann)
  (Seq (Contents (PlainBlock ann)))
  (Seq (Contents (PlainBlock ann)))
contents = (PlainBlock ann -> Seq (Fragment ann))
-> (PlainBlock ann -> Seq (Fragment ann) -> PlainBlock ann)
-> Lens
     (PlainBlock ann)
     (PlainBlock ann)
     (Seq (Fragment ann))
     (Seq (Fragment ann))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens PlainBlock ann -> Seq (Fragment ann)
forall ann. PlainBlock ann -> Seq (Fragment ann)
plainBlockLines \PlainBlock ann
x Seq (Fragment ann)
a -> PlainBlock ann
x{ plainBlockLines :: Seq (Fragment ann)
plainBlockLines = Seq (Fragment ann)
a }

type instance Annotation (PlainBlock ann) = ann

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

instance HasManyAnnotations (PlainBlock ann) (PlainBlock ann') where
    allAnnotations :: Traversal
  (PlainBlock ann)
  (PlainBlock ann')
  (Annotation (PlainBlock ann))
  (Annotation (PlainBlock ann'))
allAnnotations = TraversalVL (PlainBlock ann) (PlainBlock ann') ann ann'
-> Traversal (PlainBlock ann) (PlainBlock ann') ann ann'
forall s t a b. TraversalVL s t a b -> Traversal s t a b
traversalVL \ann -> f ann'
f (PlainBlock t a) ->
        Seq (Fragment ann') -> ann' -> PlainBlock ann'
forall ann. Seq (Fragment ann) -> ann -> PlainBlock ann
PlainBlock (Seq (Fragment ann') -> ann' -> PlainBlock ann')
-> f (Seq (Fragment ann')) -> f (ann' -> PlainBlock ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic
  A_Traversal '[] (Seq (Fragment ann)) (Seq (Fragment ann')) ann ann'
-> (ann -> f ann') -> Seq (Fragment ann) -> f (Seq (Fragment ann'))
forall k (f :: * -> *) (is :: IxList) s t a b.
(Is k A_Traversal, Applicative f) =>
Optic k is s t a b -> (a -> f b) -> s -> f t
traverseOf (Traversal
  (Seq (Fragment ann))
  (Seq (Fragment ann'))
  (Fragment ann)
  (Fragment ann')
forall (t :: * -> *) a b.
Traversable t =>
Traversal (t a) (t b) a b
traversed Traversal
  (Seq (Fragment ann))
  (Seq (Fragment ann'))
  (Fragment ann)
  (Fragment ann')
-> Optic A_Lens '[] (Fragment ann) (Fragment ann') ann ann'
-> Optic
     A_Traversal '[] (Seq (Fragment ann)) (Seq (Fragment ann')) ann ann'
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens '[] (Fragment ann) (Fragment ann') ann ann'
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation) ann -> f ann'
f Seq (Fragment ann)
t f (ann' -> PlainBlock ann') -> f ann' -> f (PlainBlock ann')
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ann -> f ann'
f ann
a


-- ⭐ Tagged PlainBlock

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

type instance Annotation (Tagged (PlainBlock ann)) = ann

instance HasTag (Tagged (PlainBlock ann)) where
    type TagOpticKind (Tagged (PlainBlock ann)) = A_Lens
    tag :: Optic'
  (TagOpticKind (Tagged (PlainBlock ann)))
  '[]
  (Tagged (PlainBlock ann))
  (Tag (Annotation (Tagged (PlainBlock ann))))
tag = (Tagged (PlainBlock ann) -> Tag ann)
-> (Tagged (PlainBlock ann) -> Tag ann -> Tagged (PlainBlock ann))
-> Lens
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     (Tag ann)
     (Tag ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tagged (PlainBlock ann) -> Tag ann
forall ann. Tagged (PlainBlock ann) -> Tag ann
plaintextTag \Tagged (PlainBlock ann)
x Tag ann
a -> Tagged (PlainBlock ann)
R:TaggedPlainBlock ann
x{ plaintextTag :: Tag ann
plaintextTag = Tag ann
a }

type instance Content (Tagged (PlainBlock ann)) = PlainBlock ann

type instance Contents (Tagged (PlainBlock ann)) = Fragment ann

instance HasContents (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann)) where
    contents :: Lens
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Seq (Contents (Tagged (PlainBlock ann))))
  (Seq (Contents (Tagged (PlainBlock ann))))
contents = Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (PlainBlock ann)
  (PlainBlock ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (PlainBlock ann)
  (PlainBlock ann)
-> Optic
     A_Lens
     '[]
     (PlainBlock ann)
     (PlainBlock ann)
     (Seq (Fragment ann))
     (Seq (Fragment ann))
-> Optic
     A_Lens
     '[]
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     (Seq (Fragment ann))
     (Seq (Fragment ann))
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic
  A_Lens
  '[]
  (PlainBlock ann)
  (PlainBlock ann)
  (Seq (Fragment ann))
  (Seq (Fragment ann))
forall x x'.
HasContents x x' =>
Lens x x' (Seq (Contents x)) (Seq (Contents x'))
contents

instance HasManyAnnotations (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann')) where
    allAnnotations :: Traversal
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann'))
  (Annotation (Tagged (PlainBlock ann)))
  (Annotation (Tagged (PlainBlock ann')))
allAnnotations = TraversalVL
  (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann')) ann ann'
-> Traversal
     (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann')) ann ann'
forall s t a b. TraversalVL s t a b -> Traversal s t a b
traversalVL \ann -> f ann'
f (TaggedPlainBlock t b) -> Tag ann' -> PlainBlock ann' -> Tagged (PlainBlock ann')
forall ann. Tag ann -> PlainBlock ann -> Tagged (PlainBlock ann)
TaggedPlainBlock
        (Tag ann' -> PlainBlock ann' -> Tagged (PlainBlock ann'))
-> f (Tag ann') -> f (PlainBlock ann' -> Tagged (PlainBlock ann'))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic A_Lens '[] (Tag ann) (Tag ann') ann ann'
-> (ann -> f ann') -> Tag ann -> f (Tag ann')
forall k (f :: * -> *) (is :: IxList) s t a b.
(Is k A_Traversal, Applicative f) =>
Optic k is s t a b -> (a -> f b) -> s -> f t
traverseOf Optic A_Lens '[] (Tag ann) (Tag ann') ann ann'
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation ann -> f ann'
f Tag ann
t f (PlainBlock ann' -> Tagged (PlainBlock ann'))
-> f (PlainBlock ann') -> f (Tagged (PlainBlock ann'))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Optic A_Traversal '[] (PlainBlock ann) (PlainBlock ann') ann ann'
-> (ann -> f ann') -> PlainBlock ann -> f (PlainBlock ann')
forall k (f :: * -> *) (is :: IxList) s t a b.
(Is k A_Traversal, Applicative f) =>
Optic k is s t a b -> (a -> f b) -> s -> f t
traverseOf Optic A_Traversal '[] (PlainBlock ann) (PlainBlock ann') ann ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f PlainBlock ann
b

instance HasAnnotation (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann)) where
     annotation :: Lens
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Annotation (Tagged (PlainBlock ann)))
  (Annotation (Tagged (PlainBlock ann)))
annotation = Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) '[] x (Tag (Annotation x))
tag Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
-> Optic A_Lens '[] (Tag ann) (Tag ann) ann ann
-> Optic
     A_Lens
     '[]
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     ann
     ann
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens '[] (Tag ann) (Tag ann) ann ann
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation

instance HasContent (Tagged (PlainBlock ann)) (Tagged (PlainBlock ann)) where
    content :: Lens
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Content (Tagged (PlainBlock ann)))
  (Content (Tagged (PlainBlock ann)))
content = (Tagged (PlainBlock ann) -> PlainBlock ann)
-> (Tagged (PlainBlock ann)
    -> PlainBlock ann -> Tagged (PlainBlock ann))
-> Lens
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     (PlainBlock ann)
     (PlainBlock ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tagged (PlainBlock ann) -> PlainBlock ann
forall ann. Tagged (PlainBlock ann) -> PlainBlock ann
taggedPlaintext \Tagged (PlainBlock ann)
x PlainBlock ann
c -> Tagged (PlainBlock ann)
R:TaggedPlainBlock ann
x{ taggedPlaintext :: PlainBlock ann
taggedPlaintext = PlainBlock ann
c }

instance HasMetadata (Tagged (PlainBlock ann)) where
    type MetadataOpticKind (Tagged (PlainBlock ann)) = A_Lens
    metadata :: Optic'
  (MetadataOpticKind (Tagged (PlainBlock ann)))
  '[]
  (Tagged (PlainBlock ann))
  Metadata
metadata = Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) '[] x (Tag (Annotation x))
tag Optic
  A_Lens
  '[]
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
-> Optic A_Lens '[] (Tag ann) (Tag ann) Metadata Metadata
-> Optic
     A_Lens
     '[]
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     Metadata
     Metadata
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens '[] (Tag ann) (Tag ann) Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) '[] x Metadata
metadata