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

import ProAbstract.Annotation
import ProAbstract.Metadata
import ProAbstract.Structure.Block
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 Annotation (BlockTag ann) = ann

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

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

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