module ProAbstract.Structure.BlockTag
    ( BlockTag (..), blockTag
    ) where

import ProAbstract.Annotation
import ProAbstract.Content
import ProAbstract.Metadata
import ProAbstract.Structure.Block
import ProAbstract.Structure.BlockTagContent
import ProAbstract.Structure.CanBePlain
import ProAbstract.Structure.CanFork
import ProAbstract.Structure.Fork
import ProAbstract.Structure.HasManyParagraphs
import ProAbstract.Structure.HasManyPlainBlocks
import ProAbstract.Structure.HasManyPlainInlines
import ProAbstract.Structure.Plain
import ProAbstract.Structure.PlainBlock
import ProAbstract.Tag

data BlockTag ann =
    BlockTagFork  (Tagged (Blocks ann))     -- ^ 'ProAbstract.fork'
  | BlockTagPlain (Tagged (PlainBlock ann)) -- ^ 'ProAbstract.plain'

type instance Content (BlockTag ann) = BlockTagContent ann

type instance Annotation (BlockTag ann) = ann

type instance Plain (BlockTag ann) = Tagged (PlainBlock ann)

type instance Fork (BlockTag ann) = Tagged (Blocks ann)

instance HasContent (BlockTag ann) (BlockTag ann) where
    content :: Lens
  (BlockTag ann)
  (BlockTag ann)
  (Content (BlockTag ann))
  (Content (BlockTag ann))
content = (BlockTag ann -> BlockTagContent ann)
-> (BlockTag ann -> BlockTagContent ann -> BlockTag ann)
-> Lens
     (BlockTag ann)
     (BlockTag ann)
     (BlockTagContent ann)
     (BlockTagContent ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens BlockTag ann -> BlockTagContent ann
forall ann. BlockTag ann -> BlockTagContent ann
f BlockTag ann -> BlockTagContent ann -> BlockTag ann
forall s.
(Is (TagOpticKind s) A_Getter, HasTag s) =>
s -> BlockTagContent (Annotation s) -> BlockTag (Annotation s)
g
      where
        f :: BlockTag ann -> BlockTagContent ann
f = \case
            BlockTagFork Tagged (Blocks ann)
x -> Blocks ann -> BlockTagContent ann
forall ann. Blocks ann -> BlockTagContent ann
BlockTagContent_Fork (Blocks ann -> BlockTagContent ann)
-> Blocks ann -> BlockTagContent ann
forall a b. (a -> b) -> a -> b
$ Optic' A_Lens NoIx (Tagged (Blocks ann)) (Blocks ann)
-> Tagged (Blocks ann) -> Blocks ann
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (Blocks ann)) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Tagged (Blocks ann)
x
            BlockTagPlain Tagged (PlainBlock ann)
x -> PlainBlock ann -> BlockTagContent ann
forall ann. PlainBlock ann -> BlockTagContent ann
BlockTagContent_Plain (PlainBlock ann -> BlockTagContent ann)
-> PlainBlock ann -> BlockTagContent ann
forall a b. (a -> b) -> a -> b
$ Optic' A_Lens NoIx (Tagged (PlainBlock ann)) (PlainBlock ann)
-> Tagged (PlainBlock ann) -> PlainBlock ann
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (PlainBlock ann)) (PlainBlock ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Tagged (PlainBlock ann)
x
        g :: s -> BlockTagContent (Annotation s) -> BlockTag (Annotation s)
g s
x = \case
            BlockTagContent_Fork Blocks (Annotation s)
c -> Tagged (Blocks (Annotation s)) -> BlockTag (Annotation s)
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork (Tagged (Blocks (Annotation s)) -> BlockTag (Annotation s))
-> Tagged (Blocks (Annotation s)) -> BlockTag (Annotation s)
forall a b. (a -> b) -> a -> b
$ Tag (Annotation s)
-> Blocks (Annotation s) -> Tagged (Blocks (Annotation s))
forall ann. Tag ann -> Blocks ann -> Tagged (Blocks ann)
TaggedBlocks Tag (Annotation s)
t Blocks (Annotation s)
c
            BlockTagContent_Plain PlainBlock (Annotation s)
c -> Tagged (PlainBlock (Annotation s)) -> BlockTag (Annotation s)
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain (Tagged (PlainBlock (Annotation s)) -> BlockTag (Annotation s))
-> Tagged (PlainBlock (Annotation s)) -> BlockTag (Annotation s)
forall a b. (a -> b) -> a -> b
$ Tag (Annotation s)
-> PlainBlock (Annotation s) -> Tagged (PlainBlock (Annotation s))
forall ann. Tag ann -> PlainBlock ann -> Tagged (PlainBlock ann)
TaggedPlainBlock Tag (Annotation s)
t PlainBlock (Annotation s)
c
          where
            t :: Tag (Annotation s)
t = Optic' (TagOpticKind s) NoIx s (Tag (Annotation s))
-> s -> Tag (Annotation s)
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' (TagOpticKind s) NoIx s (Tag (Annotation s))
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag s
x

instance CanFork (BlockTag ann) where
    fork :: Prism' (BlockTag ann) (Fork (BlockTag ann))
fork = (Tagged (Blocks ann) -> BlockTag ann)
-> (BlockTag ann -> Maybe (Tagged (Blocks ann)))
-> Prism
     (BlockTag ann)
     (BlockTag ann)
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' Tagged (Blocks ann) -> BlockTag ann
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork \case{ BlockTagFork Tagged (Blocks ann)
x -> Tagged (Blocks ann) -> Maybe (Tagged (Blocks ann))
forall a. a -> Maybe a
Just Tagged (Blocks ann)
x; BlockTag ann
_ -> Maybe (Tagged (Blocks ann))
forall a. Maybe a
Nothing }

instance CanBePlain (BlockTag ann) where
    plain :: Prism' (BlockTag ann) (Plain (BlockTag ann))
plain = (Tagged (PlainBlock ann) -> BlockTag ann)
-> (BlockTag ann -> Maybe (Tagged (PlainBlock ann)))
-> Prism
     (BlockTag ann)
     (BlockTag ann)
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' Tagged (PlainBlock ann) -> BlockTag ann
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain \case{ BlockTagPlain Tagged (PlainBlock ann)
x -> Tagged (PlainBlock ann) -> Maybe (Tagged (PlainBlock ann))
forall a. a -> Maybe a
Just Tagged (PlainBlock ann)
x; BlockTag ann
_ -> Maybe (Tagged (PlainBlock ann))
forall a. Maybe a
Nothing }

instance HasAnnotation (BlockTag ann) (BlockTag ann) where
    annotation :: Lens
  (BlockTag ann)
  (BlockTag ann)
  (Annotation (BlockTag ann))
  (Annotation (BlockTag ann))
annotation = (BlockTag ann -> ann)
-> (BlockTag ann -> ann -> BlockTag ann)
-> Lens (BlockTag ann) (BlockTag ann) ann ann
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens BlockTag ann -> ann
forall p. BlockTag p -> p
f BlockTag ann -> ann -> BlockTag ann
g
      where
        f :: BlockTag p -> p
f = \case
            BlockTagFork Tagged (Blocks p)
x -> Optic' A_Lens NoIx (Tagged (Blocks p)) p -> Tagged (Blocks p) -> p
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (Blocks p)) p
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation Tagged (Blocks p)
x
            BlockTagPlain Tagged (PlainBlock p)
x -> Optic' A_Lens NoIx (Tagged (PlainBlock p)) p
-> Tagged (PlainBlock p) -> p
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (PlainBlock p)) p
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation Tagged (PlainBlock p)
x
        g :: BlockTag ann -> ann -> BlockTag ann
g = \case
            BlockTagFork Tagged (Blocks ann)
x -> \ann
a -> Tagged (Blocks ann) -> BlockTag ann
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork (Tagged (Blocks ann) -> BlockTag ann)
-> Tagged (Blocks ann) -> BlockTag ann
forall a b. (a -> b) -> a -> b
$ Optic
  A_Lens NoIx (Tagged (Blocks ann)) (Tagged (Blocks ann)) ann ann
-> ann -> Tagged (Blocks ann) -> Tagged (Blocks ann)
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Optic
  A_Lens NoIx (Tagged (Blocks ann)) (Tagged (Blocks ann)) ann ann
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation ann
a Tagged (Blocks ann)
x
            BlockTagPlain Tagged (PlainBlock ann)
x -> \ann
a -> Tagged (PlainBlock ann) -> BlockTag ann
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain (Tagged (PlainBlock ann) -> BlockTag ann)
-> Tagged (PlainBlock ann) -> BlockTag ann
forall a b. (a -> b) -> a -> b
$ Optic
  A_Lens
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  ann
  ann
-> ann -> Tagged (PlainBlock ann) -> Tagged (PlainBlock ann)
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Optic
  A_Lens
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  ann
  ann
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation ann
a Tagged (PlainBlock ann)
x

instance HasManyAnnotations (BlockTag ann) (BlockTag ann') where
    allAnnotations :: Traversal
  (BlockTag ann)
  (BlockTag ann')
  (Annotation (BlockTag ann))
  (Annotation (BlockTag ann'))
allAnnotations = TraversalVL (BlockTag ann) (BlockTag ann') ann ann'
-> Traversal (BlockTag ann) (BlockTag ann') ann ann'
forall s t a b. TraversalVL s t a b -> Traversal s t a b
traversalVL \ann -> f ann'
f -> \case
        BlockTagFork x -> Tagged (Blocks ann') -> BlockTag ann'
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork (Tagged (Blocks ann') -> BlockTag ann')
-> f (Tagged (Blocks ann')) -> f (BlockTag ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic
  A_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann'))
  ann
  ann'
-> (ann -> f ann')
-> Tagged (Blocks ann)
-> f (Tagged (Blocks 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
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann'))
  ann
  ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f Tagged (Blocks ann)
x
        BlockTagPlain x -> Tagged (PlainBlock ann') -> BlockTag ann'
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain (Tagged (PlainBlock ann') -> BlockTag ann')
-> f (Tagged (PlainBlock ann')) -> f (BlockTag ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic
  A_Traversal
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann'))
  ann
  ann'
-> (ann -> f ann')
-> Tagged (PlainBlock ann)
-> f (Tagged (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
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann'))
  ann
  ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f Tagged (PlainBlock ann)
x

instance HasManyMetadata (BlockTag ann) where
    allMetadata :: Traversal' (BlockTag ann) Metadata
allMetadata = (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     Metadata
     Metadata
-> Traversal' (BlockTag ann) 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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  Metadata
  Metadata
forall x. HasManyMetadata x => Traversal' x Metadata
allMetadata) Traversal' (BlockTag ann) Metadata
-> Optic' An_AffineTraversal NoIx (BlockTag ann) Metadata
-> Traversal' (BlockTag ann) Metadata
forall k l (is :: IxList) s a (js :: IxList).
(Is k A_Traversal, Is l A_Traversal) =>
Optic' k is s a -> Optic' l js s a -> Traversal' s a
`adjoin` (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
forall x. CanBePlain x => Prism' x (Plain x)
plain Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
-> Optic
     A_Lens
     NoIx
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     Metadata
     Metadata
-> Optic' An_AffineTraversal NoIx (BlockTag ann) 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
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  Metadata
  Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata)

instance HasManyParagraphs (BlockTag ann) where
    allParagraphs :: Traversal' (BlockTag ann) (Paragraph (Annotation (BlockTag ann)))
allParagraphs = Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     (Paragraph ann)
     (Paragraph ann)
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (Paragraph ann)
     (Paragraph 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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Paragraph ann)
  (Paragraph ann)
forall x.
HasManyParagraphs x =>
Traversal' x (Paragraph (Annotation x))
allParagraphs

instance HasManyPlainBlocks (BlockTag ann) where
    allPlainBlocks :: Traversal'
  (BlockTag ann) (Tagged (PlainBlock (Annotation (BlockTag ann))))
allPlainBlocks = (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock 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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
forall x.
HasManyPlainBlocks x =>
Traversal' x (Tagged (PlainBlock (Annotation x)))
allPlainBlocks) Optic
  A_Traversal
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
-> Optic' A_Prism NoIx (BlockTag ann) (Tagged (PlainBlock ann))
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
forall k l (is :: IxList) s a (js :: IxList).
(Is k A_Traversal, Is l A_Traversal) =>
Optic' k is s a -> Optic' l js s a -> Traversal' s a
`adjoin` Optic' A_Prism NoIx (BlockTag ann) (Tagged (PlainBlock ann))
forall x. CanBePlain x => Prism' x (Plain x)
plain

instance HasManyPlainInlines (BlockTag ann) where
    allPlainInlines :: Traversal' (BlockTag ann) (Fragment (Annotation (BlockTag ann)))
allPlainInlines = Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     (Fragment ann)
     (Fragment ann)
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (Fragment ann)
     (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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Fragment ann)
  (Fragment ann)
forall x.
HasManyPlainInlines x =>
Traversal' x (Fragment (Annotation x))
allPlainInlines

instance HasManyTags (BlockTag ann) where
    allTags :: Traversal' (BlockTag ann) (Tag (Annotation (BlockTag ann)))
allTags = (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     (Tag ann)
     (Tag ann)
-> Optic
     A_Traversal NoIx (BlockTag ann) (BlockTag ann) (Tag ann) (Tag 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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Tag ann)
  (Tag ann)
forall x. HasManyTags x => Traversal' x (Tag (Annotation x))
allTags) Optic
  A_Traversal NoIx (BlockTag ann) (BlockTag ann) (Tag ann) (Tag ann)
-> Optic' An_AffineTraversal NoIx (BlockTag ann) (Tag ann)
-> Optic
     A_Traversal NoIx (BlockTag ann) (BlockTag ann) (Tag ann) (Tag ann)
forall k l (is :: IxList) s a (js :: IxList).
(Is k A_Traversal, Is l A_Traversal) =>
Optic' k is s a -> Optic' l js s a -> Traversal' s a
`adjoin` (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
forall x. CanBePlain x => Prism' x (Plain x)
plain Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
-> Optic
     A_Lens
     NoIx
     (Tagged (PlainBlock ann))
     (Tagged (PlainBlock ann))
     (Tag ann)
     (Tag ann)
-> Optic' An_AffineTraversal NoIx (BlockTag ann) (Tag 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
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag)
    allInlineTags :: Traversal' (BlockTag ann) (Tag (Annotation (BlockTag ann)))
allInlineTags = Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
-> Optic
     A_Traversal
     NoIx
     (Tagged (Blocks ann))
     (Tagged (Blocks ann))
     (Tag ann)
     (Tag ann)
-> Optic
     A_Traversal NoIx (BlockTag ann) (BlockTag ann) (Tag ann) (Tag 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_Traversal
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Tag ann)
  (Tag ann)
forall x. HasManyTags x => Traversal' x (Tag (Annotation x))
allInlineTags

instance HasTag (BlockTag ann) where
    type TagOpticKind (BlockTag ann) = A_Lens
    tag :: Optic'
  (TagOpticKind (BlockTag ann))
  NoIx
  (BlockTag ann)
  (Tag (Annotation (BlockTag ann)))
tag = (BlockTag ann -> Tag ann)
-> (BlockTag ann -> Tag ann -> BlockTag ann)
-> Lens (BlockTag ann) (BlockTag ann) (Tag ann) (Tag ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens BlockTag ann -> Tag ann
forall ann. BlockTag ann -> Tag ann
f BlockTag ann -> Tag ann -> BlockTag ann
forall ann. BlockTag ann -> Tag ann -> BlockTag ann
g
      where
        f :: BlockTag ann -> Tag ann
f = \case
            BlockTagFork Tagged (Blocks ann)
x -> Optic' A_Lens NoIx (Tagged (Blocks ann)) (Tag ann)
-> Tagged (Blocks ann) -> Tag ann
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (Blocks ann)) (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tagged (Blocks ann)
x
            BlockTagPlain Tagged (PlainBlock ann)
x -> Optic' A_Lens NoIx (Tagged (PlainBlock ann)) (Tag ann)
-> Tagged (PlainBlock ann) -> Tag ann
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (Tagged (PlainBlock ann)) (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tagged (PlainBlock ann)
x
        g :: BlockTag ann -> Tag ann -> BlockTag ann
g = \case
            BlockTagFork Tagged (Blocks ann)
x -> \Tag ann
a -> Tagged (Blocks ann) -> BlockTag ann
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork (Optic
  A_Lens
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Tag ann)
  (Tag ann)
-> Tag ann -> Tagged (Blocks ann) -> Tagged (Blocks ann)
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Optic
  A_Lens
  NoIx
  (Tagged (Blocks ann))
  (Tagged (Blocks ann))
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tag ann
a Tagged (Blocks ann)
x)
            BlockTagPlain Tagged (PlainBlock ann)
x -> \Tag ann
a -> Tagged (PlainBlock ann) -> BlockTag ann
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain (Optic
  A_Lens
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
-> Tag ann -> Tagged (PlainBlock ann) -> Tagged (PlainBlock ann)
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
set Optic
  A_Lens
  NoIx
  (Tagged (PlainBlock ann))
  (Tagged (PlainBlock ann))
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tag ann
a Tagged (PlainBlock ann)
x)

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

blockTag :: Prism' (Block ann) (BlockTag ann)
blockTag :: Prism' (Block ann) (BlockTag ann)
blockTag = (BlockTag ann -> Block ann)
-> (Block ann -> Maybe (BlockTag ann))
-> Prism' (Block ann) (BlockTag ann)
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' BlockTag ann -> Block ann
forall ann. BlockTag ann -> Block ann
f Block ann -> Maybe (BlockTag ann)
forall ann. Block ann -> Maybe (BlockTag ann)
g
  where
    f :: BlockTag ann -> Block ann
f = \case
      BlockTagFork Tagged (Blocks ann)
x -> Tagged (Blocks ann) -> Block ann
forall ann. Tagged (Blocks ann) -> Block ann
BlockFork Tagged (Blocks ann)
x
      BlockTagPlain Tagged (PlainBlock ann)
x -> Tagged (PlainBlock ann) -> Block ann
forall ann. Tagged (PlainBlock ann) -> Block ann
BlockPlain Tagged (PlainBlock ann)
x
    g :: Block ann -> Maybe (BlockTag ann)
g = \case
      BlockFork Tagged (Blocks ann)
x -> BlockTag ann -> Maybe (BlockTag ann)
forall a. a -> Maybe a
Just (Tagged (Blocks ann) -> BlockTag ann
forall ann. Tagged (Blocks ann) -> BlockTag ann
BlockTagFork Tagged (Blocks ann)
x)
      BlockPlain Tagged (PlainBlock ann)
x -> BlockTag ann -> Maybe (BlockTag ann)
forall a. a -> Maybe a
Just (Tagged (PlainBlock ann) -> BlockTag ann
forall ann. Tagged (PlainBlock ann) -> BlockTag ann
BlockTagPlain Tagged (PlainBlock ann)
x)
      Block ann
_ -> Maybe (BlockTag ann)
forall a. Maybe a
Nothing