module ProAbstract.Structure.Document
    ( Document (..)
    ) where

import ProAbstract.Annotation
import ProAbstract.Content
import ProAbstract.Metadata
import ProAbstract.Structure.Block
import ProAbstract.Structure.HasManyParagraphs
import ProAbstract.Structure.HasManyPlainBlocks
import ProAbstract.Structure.HasManyPlainInlines
import ProAbstract.Tag

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

type instance Annotation (Document ann) = ann

type instance Content (Document ann) = Blocks ann

type instance Contents (Document ann) = Block ann

instance HasContent (Document ann) (Document ann') where
    content :: Lens
  (Document ann)
  (Document ann')
  (Content (Document ann))
  (Content (Document ann'))
content = (Document ann -> Blocks ann)
-> (Document ann -> Blocks ann' -> Document ann')
-> Lens (Document ann) (Document ann') (Blocks ann) (Blocks ann')
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Document ann -> Blocks ann
forall ann. Document ann -> Blocks ann
documentContent (\Document ann
d Blocks ann'
c -> Document ann
d { documentContent :: Blocks ann'
documentContent = Blocks ann'
c })

instance HasContents (Document ann) (Document ann') where
    contents :: Lens
  (Document ann)
  (Document ann')
  (Seq (Contents (Document ann)))
  (Seq (Contents (Document ann')))
contents = Optic
  A_Lens
  NoIx
  (Document ann)
  (Document ann')
  (Blocks ann)
  (Blocks ann')
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens
  NoIx
  (Document ann)
  (Document ann')
  (Blocks ann)
  (Blocks ann')
-> Optic
     A_Lens
     NoIx
     (Blocks ann)
     (Blocks ann')
     (Seq (Block ann))
     (Seq (Block ann'))
-> Optic
     A_Lens
     NoIx
     (Document ann)
     (Document ann')
     (Seq (Block ann))
     (Seq (Block 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
  (Blocks ann)
  (Blocks ann')
  (Seq (Block ann))
  (Seq (Block ann'))
forall x x'.
HasContents x x' =>
Lens x x' (Seq (Contents x)) (Seq (Contents x'))
contents

instance HasMetadata (Document ann) where
    type MetadataOpticKind (Document ann) = A_Lens
    metadata :: Optic'
  (MetadataOpticKind (Document ann)) NoIx (Document ann) Metadata
metadata = (Document ann -> Metadata)
-> (Document ann -> Metadata -> Document ann)
-> Lens (Document ann) (Document ann) Metadata Metadata
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Document ann -> Metadata
forall ann. Document ann -> Metadata
documentMetadata (\Document ann
d Metadata
m -> Document ann
d { documentMetadata :: Metadata
documentMetadata = Metadata
m })

instance HasManyPlainInlines (Document ann) where
    allPlainInlines :: Traversal' (Document ann) (Fragment (Annotation (Document ann)))
allPlainInlines = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal
     NoIx
     (Blocks ann)
     (Blocks ann)
     (Fragment ann)
     (Fragment ann)
-> Optic
     A_Traversal
     NoIx
     (Document ann)
     (Document 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
  (Blocks ann)
  (Blocks ann)
  (Fragment ann)
  (Fragment ann)
forall x.
HasManyPlainInlines x =>
Traversal' x (Fragment (Annotation x))
allPlainInlines

instance HasManyPlainBlocks (Document ann) where
    allPlainBlocks :: Traversal'
  (Document ann) (TaggedPlainBlock (Annotation (Document ann)))
allPlainBlocks = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal
     NoIx
     (Blocks ann)
     (Blocks ann)
     (TaggedPlainBlock ann)
     (TaggedPlainBlock ann)
-> Optic
     A_Traversal
     NoIx
     (Document ann)
     (Document 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
  (Blocks ann)
  (Blocks ann)
  (TaggedPlainBlock ann)
  (TaggedPlainBlock ann)
forall x.
HasManyPlainBlocks x =>
Traversal' x (TaggedPlainBlock (Annotation x))
allPlainBlocks

instance HasManyAnnotations (Document ann) (Document ann') where
    allAnnotations :: Traversal
  (Document ann)
  (Document ann')
  (Annotation (Document ann))
  (Annotation (Document ann'))
allAnnotations = Optic
  A_Lens
  NoIx
  (Document ann)
  (Document ann')
  (Blocks ann)
  (Blocks ann')
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens
  NoIx
  (Document ann)
  (Document ann')
  (Blocks ann)
  (Blocks ann')
-> Optic A_Traversal NoIx (Blocks ann) (Blocks ann') ann ann'
-> Optic A_Traversal NoIx (Document ann) (Document 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_Traversal NoIx (Blocks ann) (Blocks ann') ann ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations

instance HasManyMetadata (Document ann) where
    allMetadata :: Traversal' (Document ann) Metadata
allMetadata = Optic A_Lens NoIx (Document ann) (Document ann) Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata Optic A_Lens NoIx (Document ann) (Document ann) Metadata Metadata
-> Traversal' (Document ann) Metadata
-> Traversal' (Document 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_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal NoIx (Blocks ann) (Blocks ann) Metadata Metadata
-> Traversal' (Document 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 (Blocks ann) (Blocks ann) Metadata Metadata
forall x. HasManyMetadata x => Traversal' x Metadata
allMetadata)

instance HasManyParagraphs (Document ann) where
    allParagraphs :: Traversal' (Document ann) (Paragraph (Annotation (Document ann)))
allParagraphs = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal
     NoIx
     (Blocks ann)
     (Blocks ann)
     (Paragraph ann)
     (Paragraph ann)
-> Optic
     A_Traversal
     NoIx
     (Document ann)
     (Document 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
  (Blocks ann)
  (Blocks ann)
  (Paragraph ann)
  (Paragraph ann)
forall x.
HasManyParagraphs x =>
Traversal' x (Paragraph (Annotation x))
allParagraphs

instance HasManyTags (Document ann) where
    allTags :: Traversal' (Document ann) (Tag (Annotation (Document ann)))
allTags = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal NoIx (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
-> Optic
     A_Traversal NoIx (Document ann) (Document 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 (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
forall x. HasManyTags x => Traversal' x (Tag (Annotation x))
allTags
    allInlineTags :: Traversal' (Document ann) (Tag (Annotation (Document ann)))
allInlineTags = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal NoIx (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
-> Optic
     A_Traversal NoIx (Document ann) (Document 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 (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
forall x. HasManyTags x => Traversal' x (Tag (Annotation x))
allInlineTags

instance HasWitherableTags (Document ann) where
    witherTags :: (Tag (Annotation (Document ann))
 -> f (Maybe (Tag (Annotation (Document ann)))))
-> Document ann -> f (Document ann)
witherTags Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> (Blocks ann -> f (Blocks ann))
-> Document ann
-> f (Document 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 NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content ((Tag (Annotation (Blocks ann))
 -> f (Maybe (Tag (Annotation (Blocks ann)))))
-> Blocks ann -> f (Blocks ann)
forall x (f :: * -> *).
(HasWitherableTags x, Monad f) =>
(Tag (Annotation x) -> f (Maybe (Tag (Annotation x)))) -> x -> f x
witherTags Tag (Annotation (Blocks ann))
-> f (Maybe (Tag (Annotation (Blocks ann))))
Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f)

instance HasManyBlockTags (Document ann) where
    allBlockTags :: Traversal' (Document ann) (Tag (Annotation (Document ann)))
allBlockTags = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> Optic
     A_Traversal NoIx (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
-> Optic
     A_Traversal NoIx (Document ann) (Document 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 (Blocks ann) (Blocks ann) (Tag ann) (Tag ann)
forall x. HasManyBlockTags x => Traversal' x (Tag (Annotation x))
allBlockTags

instance HasWitherableBlockTags (Document ann) where
    witherBlockTags :: (Tag (Annotation (Document ann))
 -> f (Maybe (Tag (Annotation (Document ann)))))
-> Document ann -> f (Document ann)
witherBlockTags Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> (Blocks ann -> f (Blocks ann))
-> Document ann
-> f (Document 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 NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content ((Tag (Annotation (Blocks ann))
 -> f (Maybe (Tag (Annotation (Blocks ann)))))
-> Blocks ann -> f (Blocks ann)
forall x (f :: * -> *).
(HasWitherableBlockTags x, Monad f) =>
(Tag (Annotation x) -> f (Maybe (Tag (Annotation x)))) -> x -> f x
witherBlockTags Tag (Annotation (Blocks ann))
-> f (Maybe (Tag (Annotation (Blocks ann))))
Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f)

instance HasWitherableInlineTags (Document ann) where
    witherInlineTags :: (Tag (Annotation (Document ann))
 -> f (Maybe (Tag (Annotation (Document ann)))))
-> Document ann -> f (Document ann)
witherInlineTags Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f = Optic
  A_Lens NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
-> (Blocks ann -> f (Blocks ann))
-> Document ann
-> f (Document 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 NoIx (Document ann) (Document ann) (Blocks ann) (Blocks ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content ((Tag (Annotation (Blocks ann))
 -> f (Maybe (Tag (Annotation (Blocks ann)))))
-> Blocks ann -> f (Blocks ann)
forall x (f :: * -> *).
(HasWitherableInlineTags x, Monad f) =>
(Tag (Annotation x) -> f (Maybe (Tag (Annotation x)))) -> x -> f x
witherInlineTags Tag (Annotation (Blocks ann))
-> f (Maybe (Tag (Annotation (Blocks ann))))
Tag (Annotation (Document ann))
-> f (Maybe (Tag (Annotation (Document ann))))
f)