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  (TaggedBlocks ann)     -- ^ 'ProAbstract.fork'
  | BlockTagPlain (TaggedPlainBlock ann) -- ^ 'ProAbstract.plain'
  deriving stock (BlockTag ann -> BlockTag ann -> Bool
(BlockTag ann -> BlockTag ann -> Bool)
-> (BlockTag ann -> BlockTag ann -> Bool) -> Eq (BlockTag ann)
forall ann. Eq ann => BlockTag ann -> BlockTag ann -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BlockTag ann -> BlockTag ann -> Bool
$c/= :: forall ann. Eq ann => BlockTag ann -> BlockTag ann -> Bool
== :: BlockTag ann -> BlockTag ann -> Bool
$c== :: forall ann. Eq ann => BlockTag ann -> BlockTag ann -> Bool
Eq, Int -> BlockTag ann -> ShowS
[BlockTag ann] -> ShowS
BlockTag ann -> String
(Int -> BlockTag ann -> ShowS)
-> (BlockTag ann -> String)
-> ([BlockTag ann] -> ShowS)
-> Show (BlockTag ann)
forall ann. Show ann => Int -> BlockTag ann -> ShowS
forall ann. Show ann => [BlockTag ann] -> ShowS
forall ann. Show ann => BlockTag ann -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BlockTag ann] -> ShowS
$cshowList :: forall ann. Show ann => [BlockTag ann] -> ShowS
show :: BlockTag ann -> String
$cshow :: forall ann. Show ann => BlockTag ann -> String
showsPrec :: Int -> BlockTag ann -> ShowS
$cshowsPrec :: forall ann. Show ann => Int -> BlockTag ann -> ShowS
Show, (forall x. BlockTag ann -> Rep (BlockTag ann) x)
-> (forall x. Rep (BlockTag ann) x -> BlockTag ann)
-> Generic (BlockTag ann)
forall x. Rep (BlockTag ann) x -> BlockTag ann
forall x. BlockTag ann -> Rep (BlockTag ann) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ann x. Rep (BlockTag ann) x -> BlockTag ann
forall ann x. BlockTag ann -> Rep (BlockTag ann) x
$cto :: forall ann x. Rep (BlockTag ann) x -> BlockTag ann
$cfrom :: forall ann x. BlockTag ann -> Rep (BlockTag ann) x
Generic)
  deriving anyclass (Eq (BlockTag ann)
Eq (BlockTag ann)
-> (Int -> BlockTag ann -> Int)
-> (BlockTag ann -> Int)
-> Hashable (BlockTag ann)
Int -> BlockTag ann -> Int
BlockTag ann -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
forall ann. Hashable ann => Eq (BlockTag ann)
forall ann. Hashable ann => Int -> BlockTag ann -> Int
forall ann. Hashable ann => BlockTag ann -> Int
hash :: BlockTag ann -> Int
$chash :: forall ann. Hashable ann => BlockTag ann -> Int
hashWithSalt :: Int -> BlockTag ann -> Int
$chashWithSalt :: forall ann. Hashable ann => Int -> BlockTag ann -> Int
$cp1Hashable :: forall ann. Hashable ann => Eq (BlockTag ann)
Hashable, BlockTag ann -> ()
(BlockTag ann -> ()) -> NFData (BlockTag ann)
forall ann. NFData ann => BlockTag ann -> ()
forall a. (a -> ()) -> NFData a
rnf :: BlockTag ann -> ()
$crnf :: forall ann. NFData ann => BlockTag ann -> ()
NFData)

type instance Content (BlockTag ann) = BlockTagContent ann

type instance Annotation (BlockTag ann) = ann

type instance Plain (BlockTag ann) = TaggedPlainBlock ann

type instance Fork (BlockTag ann) = TaggedBlocks 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 TaggedBlocks 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 (TaggedBlocks ann) (Blocks ann)
-> TaggedBlocks 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 (TaggedBlocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content TaggedBlocks ann
x
            BlockTagPlain TaggedPlainBlock 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 (TaggedPlainBlock ann) (PlainBlock ann)
-> TaggedPlainBlock 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 (TaggedPlainBlock ann) (PlainBlock ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content TaggedPlainBlock ann
x
        g :: s -> BlockTagContent (Annotation s) -> BlockTag (Annotation s)
g s
x = \case
            BlockTagContent_Fork Blocks (Annotation s)
c -> TaggedBlocks (Annotation s) -> BlockTag (Annotation s)
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork (TaggedBlocks (Annotation s) -> BlockTag (Annotation s))
-> TaggedBlocks (Annotation s) -> BlockTag (Annotation s)
forall a b. (a -> b) -> a -> b
$ Tag (Annotation s)
-> Blocks (Annotation s) -> TaggedBlocks (Annotation s)
forall ann. Tag ann -> Blocks ann -> TaggedBlocks ann
TaggedBlocks Tag (Annotation s)
t Blocks (Annotation s)
c
            BlockTagContent_Plain PlainBlock (Annotation s)
c -> TaggedPlainBlock (Annotation s) -> BlockTag (Annotation s)
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain (TaggedPlainBlock (Annotation s) -> BlockTag (Annotation s))
-> TaggedPlainBlock (Annotation s) -> BlockTag (Annotation s)
forall a b. (a -> b) -> a -> b
$ Tag (Annotation s)
-> PlainBlock (Annotation s) -> TaggedPlainBlock (Annotation s)
forall ann. Tag ann -> PlainBlock ann -> TaggedPlainBlock 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 = (TaggedBlocks ann -> BlockTag ann)
-> (BlockTag ann -> Maybe (TaggedBlocks ann))
-> Prism
     (BlockTag ann) (BlockTag ann) (TaggedBlocks ann) (TaggedBlocks ann)
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' TaggedBlocks ann -> BlockTag ann
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork \case{ BlockTagFork TaggedBlocks ann
x -> TaggedBlocks ann -> Maybe (TaggedBlocks ann)
forall a. a -> Maybe a
Just TaggedBlocks ann
x; BlockTag ann
_ -> Maybe (TaggedBlocks ann)
forall a. Maybe a
Nothing }

instance CanBePlain (BlockTag ann) where
    plain :: Prism' (BlockTag ann) (Plain (BlockTag ann))
plain = (TaggedPlainBlock ann -> BlockTag ann)
-> (BlockTag ann -> Maybe (TaggedPlainBlock ann))
-> Prism
     (BlockTag ann)
     (BlockTag ann)
     (TaggedPlainBlock ann)
     (TaggedPlainBlock ann)
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' TaggedPlainBlock ann -> BlockTag ann
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain \case{ BlockTagPlain TaggedPlainBlock ann
x -> TaggedPlainBlock ann -> Maybe (TaggedPlainBlock ann)
forall a. a -> Maybe a
Just TaggedPlainBlock ann
x; BlockTag ann
_ -> Maybe (TaggedPlainBlock 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 TaggedBlocks p
x -> Optic' A_Lens NoIx (TaggedBlocks p) p -> TaggedBlocks p -> p
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (TaggedBlocks p) p
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation TaggedBlocks p
x
            BlockTagPlain TaggedPlainBlock p
x -> Optic' A_Lens NoIx (TaggedPlainBlock p) p
-> TaggedPlainBlock p -> p
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Lens NoIx (TaggedPlainBlock p) p
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation TaggedPlainBlock p
x
        g :: BlockTag ann -> ann -> BlockTag ann
g = \case
            BlockTagFork TaggedBlocks ann
x -> \ann
a -> TaggedBlocks ann -> BlockTag ann
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork (TaggedBlocks ann -> BlockTag ann)
-> TaggedBlocks ann -> BlockTag ann
forall a b. (a -> b) -> a -> b
$ Optic A_Lens NoIx (TaggedBlocks ann) (TaggedBlocks ann) ann ann
-> ann -> TaggedBlocks ann -> TaggedBlocks 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 (TaggedBlocks ann) (TaggedBlocks ann) ann ann
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation ann
a TaggedBlocks ann
x
            BlockTagPlain TaggedPlainBlock ann
x -> \ann
a -> TaggedPlainBlock ann -> BlockTag ann
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain (TaggedPlainBlock ann -> BlockTag ann)
-> TaggedPlainBlock ann -> BlockTag ann
forall a b. (a -> b) -> a -> b
$ Optic
  A_Lens NoIx (TaggedPlainBlock ann) (TaggedPlainBlock ann) ann ann
-> ann -> TaggedPlainBlock ann -> TaggedPlainBlock 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 (TaggedPlainBlock ann) (TaggedPlainBlock ann) ann ann
forall x x'.
HasAnnotation x x' =>
Lens x x' (Annotation x) (Annotation x')
annotation ann
a TaggedPlainBlock 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 -> TaggedBlocks ann' -> BlockTag ann'
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork (TaggedBlocks ann' -> BlockTag ann')
-> f (TaggedBlocks ann') -> f (BlockTag ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic
  A_Traversal NoIx (TaggedBlocks ann) (TaggedBlocks ann') ann ann'
-> (ann -> f ann') -> TaggedBlocks ann -> f (TaggedBlocks 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 (TaggedBlocks ann) (TaggedBlocks ann') ann ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f TaggedBlocks ann
x
        BlockTagPlain x -> TaggedPlainBlock ann' -> BlockTag ann'
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain (TaggedPlainBlock ann' -> BlockTag ann')
-> f (TaggedPlainBlock ann') -> f (BlockTag ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic
  A_Traversal
  NoIx
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann')
  ann
  ann'
-> (ann -> f ann')
-> TaggedPlainBlock ann
-> f (TaggedPlainBlock 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
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann')
  ann
  ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f TaggedPlainBlock ann
x

instance HasManyMetadata (BlockTag ann) where
    allMetadata :: Traversal' (BlockTag ann) Metadata
allMetadata = (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks 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)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
forall x. CanBePlain x => Prism' x (Plain x)
plain Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
-> Optic
     A_Lens
     NoIx
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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
  (TaggedPlainBlock ann)
  (TaggedPlainBlock 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)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks ann)
  (Paragraph ann)
  (Paragraph ann)
forall x.
HasManyParagraphs x =>
Traversal' x (Paragraph (Annotation x))
allParagraphs

instance HasManyPlainBlocks (BlockTag ann) where
    allPlainBlocks :: Traversal'
  (BlockTag ann) (TaggedPlainBlock (Annotation (BlockTag ann)))
allPlainBlocks = (Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks ann)
     (TaggedPlainBlock ann)
     (TaggedPlainBlock ann)
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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
  (TaggedBlocks ann)
  (TaggedBlocks ann)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
forall x.
HasManyPlainBlocks x =>
Traversal' x (TaggedPlainBlock (Annotation x))
allPlainBlocks) Optic
  A_Traversal
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
-> Optic' A_Prism NoIx (BlockTag ann) (TaggedPlainBlock ann)
-> Optic
     A_Traversal
     NoIx
     (BlockTag ann)
     (BlockTag ann)
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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) (TaggedPlainBlock 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)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks 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)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks 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)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
forall x. CanBePlain x => Prism' x (Plain x)
plain Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
-> Optic
     A_Lens
     NoIx
     (TaggedPlainBlock ann)
     (TaggedPlainBlock 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
  (TaggedPlainBlock ann)
  (TaggedPlainBlock 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)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
forall x. CanFork x => Prism' x (Fork x)
fork Optic
  A_Prism
  NoIx
  (BlockTag ann)
  (BlockTag ann)
  (TaggedBlocks ann)
  (TaggedBlocks ann)
-> Optic
     A_Traversal
     NoIx
     (TaggedBlocks ann)
     (TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks 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 TaggedBlocks ann
x -> Optic' A_Lens NoIx (TaggedBlocks ann) (Tag ann)
-> TaggedBlocks 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 (TaggedBlocks ann) (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag TaggedBlocks ann
x
            BlockTagPlain TaggedPlainBlock ann
x -> Optic' A_Lens NoIx (TaggedPlainBlock ann) (Tag ann)
-> TaggedPlainBlock 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 (TaggedPlainBlock ann) (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag TaggedPlainBlock ann
x
        g :: BlockTag ann -> Tag ann -> BlockTag ann
g = \case
            BlockTagFork TaggedBlocks ann
x -> \Tag ann
a -> TaggedBlocks ann -> BlockTag ann
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork (Optic
  A_Lens
  NoIx
  (TaggedBlocks ann)
  (TaggedBlocks ann)
  (Tag ann)
  (Tag ann)
-> Tag ann -> TaggedBlocks ann -> TaggedBlocks 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
  (TaggedBlocks ann)
  (TaggedBlocks ann)
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tag ann
a TaggedBlocks ann
x)
            BlockTagPlain TaggedPlainBlock ann
x -> \Tag ann
a -> TaggedPlainBlock ann -> BlockTag ann
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain (Optic
  A_Lens
  NoIx
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
-> Tag ann -> TaggedPlainBlock ann -> TaggedPlainBlock 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
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
  (Tag ann)
  (Tag ann)
forall x.
HasTag x =>
Optic' (TagOpticKind x) NoIx x (Tag (Annotation x))
tag Tag ann
a TaggedPlainBlock 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 TaggedBlocks ann
x -> TaggedBlocks ann -> Block ann
forall ann. TaggedBlocks ann -> Block ann
BlockFork TaggedBlocks ann
x
      BlockTagPlain TaggedPlainBlock ann
x -> TaggedPlainBlock ann -> Block ann
forall ann. TaggedPlainBlock ann -> Block ann
BlockPlain TaggedPlainBlock ann
x
    g :: Block ann -> Maybe (BlockTag ann)
g = \case
      BlockFork TaggedBlocks ann
x -> BlockTag ann -> Maybe (BlockTag ann)
forall a. a -> Maybe a
Just (TaggedBlocks ann -> BlockTag ann
forall ann. TaggedBlocks ann -> BlockTag ann
BlockTagFork TaggedBlocks ann
x)
      BlockPlain TaggedPlainBlock ann
x -> BlockTag ann -> Maybe (BlockTag ann)
forall a. a -> Maybe a
Just (TaggedPlainBlock ann -> BlockTag ann
forall ann. TaggedPlainBlock ann -> BlockTag ann
BlockTagPlain TaggedPlainBlock ann
x)
      Block ann
_ -> Maybe (BlockTag ann)
forall a. Maybe a
Nothing