module ProAbstract.Structure.PlainBlock
    ( PlainBlock (..), TaggedPlainBlock (..)
    ) 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


-- ⭐ TaggedPlainBlock

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

type instance Annotation (TaggedPlainBlock ann) = ann

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

type instance Content (TaggedPlainBlock ann) = PlainBlock ann

type instance Contents (TaggedPlainBlock ann) = Fragment ann

instance HasContents (TaggedPlainBlock ann) (TaggedPlainBlock ann) where
    contents :: Lens
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Seq (Contents (TaggedPlainBlock ann)))
  (Seq (Contents (TaggedPlainBlock ann)))
contents = Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (PlainBlock ann)
  (PlainBlock ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (PlainBlock ann)
  (PlainBlock ann)
-> Optic
     A_Lens
     '[]
     (PlainBlock ann)
     (PlainBlock ann)
     (Seq (Fragment ann))
     (Seq (Fragment ann))
-> Optic
     A_Lens
     '[]
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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 (TaggedPlainBlock ann) (TaggedPlainBlock ann') where
    allAnnotations :: Traversal
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann')
  (Annotation (TaggedPlainBlock ann))
  (Annotation (TaggedPlainBlock ann'))
allAnnotations = TraversalVL (TaggedPlainBlock ann) (TaggedPlainBlock ann') ann ann'
-> Traversal
     (TaggedPlainBlock ann) (TaggedPlainBlock 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' -> TaggedPlainBlock ann'
forall ann. Tag ann -> PlainBlock ann -> TaggedPlainBlock ann
TaggedPlainBlock
        (Tag ann' -> PlainBlock ann' -> TaggedPlainBlock ann')
-> f (Tag ann') -> f (PlainBlock ann' -> TaggedPlainBlock 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' -> TaggedPlainBlock ann')
-> f (PlainBlock ann') -> f (TaggedPlainBlock 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 (TaggedPlainBlock ann) (TaggedPlainBlock ann) where
     annotation :: Lens
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Annotation (TaggedPlainBlock ann))
  (Annotation (TaggedPlainBlock ann))
annotation = Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) '[] x (Tag (Annotation x))
tag Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
-> Optic A_Lens '[] (Tag ann) (Tag ann) ann ann
-> Optic
     A_Lens '[] (TaggedPlainBlock ann) (TaggedPlainBlock 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 (TaggedPlainBlock ann) (TaggedPlainBlock ann) where
    content :: Lens
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Content (TaggedPlainBlock ann))
  (Content (TaggedPlainBlock ann))
content = (TaggedPlainBlock ann -> PlainBlock ann)
-> (TaggedPlainBlock ann -> PlainBlock ann -> TaggedPlainBlock ann)
-> Lens
     (TaggedPlainBlock ann)
     (TaggedPlainBlock ann)
     (PlainBlock ann)
     (PlainBlock ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens TaggedPlainBlock ann -> PlainBlock ann
forall ann. TaggedPlainBlock ann -> PlainBlock ann
taggedPlaintext \TaggedPlainBlock ann
x PlainBlock ann
c -> TaggedPlainBlock ann
x{ taggedPlaintext :: PlainBlock ann
taggedPlaintext = PlainBlock ann
c }

instance HasMetadata (TaggedPlainBlock ann) where
    type MetadataOpticKind (TaggedPlainBlock ann) = A_Lens
    metadata :: Optic'
  (MetadataOpticKind (TaggedPlainBlock ann))
  '[]
  (TaggedPlainBlock ann)
  Metadata
metadata = Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) '[] x (Tag (Annotation x))
tag Optic
  A_Lens
  '[]
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
-> Optic A_Lens '[] (Tag ann) (Tag ann) Metadata Metadata
-> Optic
     A_Lens
     '[]
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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