module ProAbstract.Structure.Paragraph
    ( Paragraph (..)
    ) where

import ProAbstract.Annotation
import ProAbstract.Content
import ProAbstract.Metadata
import ProAbstract.Structure.HasManyPlainInlines
import ProAbstract.Structure.Inline
import ProAbstract.Tag

-- | A collection of 'Lines'. A 'Paragraph' represents the border between block and inline contexts. All ancestors of a paragraph are block items or a document, and all children are inline items.
data Paragraph ann = Paragraph
    { Paragraph ann -> Lines ann
paragraphContent :: Lines ann -- ^ 'ProAbstract.content'
    , Paragraph ann -> ann
paragraphAnnotation :: ann -- ^ 'ProAbstract.annotation'
    }
  deriving stock (Paragraph ann -> Paragraph ann -> Bool
(Paragraph ann -> Paragraph ann -> Bool)
-> (Paragraph ann -> Paragraph ann -> Bool) -> Eq (Paragraph ann)
forall ann. Eq ann => Paragraph ann -> Paragraph ann -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Paragraph ann -> Paragraph ann -> Bool
$c/= :: forall ann. Eq ann => Paragraph ann -> Paragraph ann -> Bool
== :: Paragraph ann -> Paragraph ann -> Bool
$c== :: forall ann. Eq ann => Paragraph ann -> Paragraph ann -> Bool
Eq, Int -> Paragraph ann -> ShowS
[Paragraph ann] -> ShowS
Paragraph ann -> String
(Int -> Paragraph ann -> ShowS)
-> (Paragraph ann -> String)
-> ([Paragraph ann] -> ShowS)
-> Show (Paragraph ann)
forall ann. Show ann => Int -> Paragraph ann -> ShowS
forall ann. Show ann => [Paragraph ann] -> ShowS
forall ann. Show ann => Paragraph ann -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Paragraph ann] -> ShowS
$cshowList :: forall ann. Show ann => [Paragraph ann] -> ShowS
show :: Paragraph ann -> String
$cshow :: forall ann. Show ann => Paragraph ann -> String
showsPrec :: Int -> Paragraph ann -> ShowS
$cshowsPrec :: forall ann. Show ann => Int -> Paragraph ann -> ShowS
Show, (forall x. Paragraph ann -> Rep (Paragraph ann) x)
-> (forall x. Rep (Paragraph ann) x -> Paragraph ann)
-> Generic (Paragraph ann)
forall x. Rep (Paragraph ann) x -> Paragraph ann
forall x. Paragraph ann -> Rep (Paragraph ann) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall ann x. Rep (Paragraph ann) x -> Paragraph ann
forall ann x. Paragraph ann -> Rep (Paragraph ann) x
$cto :: forall ann x. Rep (Paragraph ann) x -> Paragraph ann
$cfrom :: forall ann x. Paragraph ann -> Rep (Paragraph ann) x
Generic)
  deriving anyclass (Eq (Paragraph ann)
Eq (Paragraph ann)
-> (Int -> Paragraph ann -> Int)
-> (Paragraph ann -> Int)
-> Hashable (Paragraph ann)
Int -> Paragraph ann -> Int
Paragraph ann -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
forall ann. Hashable ann => Eq (Paragraph ann)
forall ann. Hashable ann => Int -> Paragraph ann -> Int
forall ann. Hashable ann => Paragraph ann -> Int
hash :: Paragraph ann -> Int
$chash :: forall ann. Hashable ann => Paragraph ann -> Int
hashWithSalt :: Int -> Paragraph ann -> Int
$chashWithSalt :: forall ann. Hashable ann => Int -> Paragraph ann -> Int
$cp1Hashable :: forall ann. Hashable ann => Eq (Paragraph ann)
Hashable, Paragraph ann -> ()
(Paragraph ann -> ()) -> NFData (Paragraph ann)
forall ann. NFData ann => Paragraph ann -> ()
forall a. (a -> ()) -> NFData a
rnf :: Paragraph ann -> ()
$crnf :: forall ann. NFData ann => Paragraph ann -> ()
NFData)

type instance Content (Paragraph ann) = Lines ann

type instance Contents (Paragraph ann) = Line ann

type instance Annotation (Paragraph ann) = ann

instance HasManyAnnotations (Paragraph ann) (Paragraph ann') where
    allAnnotations :: Traversal
  (Paragraph ann)
  (Paragraph ann')
  (Annotation (Paragraph ann))
  (Annotation (Paragraph ann'))
allAnnotations = TraversalVL (Paragraph ann) (Paragraph ann') ann ann'
-> Traversal (Paragraph ann) (Paragraph ann') ann ann'
forall s t a b. TraversalVL s t a b -> Traversal s t a b
traversalVL \ann -> f ann'
f (Paragraph c a) ->
        Lines ann' -> ann' -> Paragraph ann'
forall ann. Lines ann -> ann -> Paragraph ann
Paragraph (Lines ann' -> ann' -> Paragraph ann')
-> f (Lines ann') -> f (ann' -> Paragraph ann')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Optic A_Traversal NoIx (Lines ann) (Lines ann') ann ann'
-> (ann -> f ann') -> Lines ann -> f (Lines 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 (Lines ann) (Lines ann') ann ann'
forall x x'.
HasManyAnnotations x x' =>
Traversal x x' (Annotation x) (Annotation x')
allAnnotations ann -> f ann'
f Lines ann
c f (ann' -> Paragraph ann') -> f ann' -> f (Paragraph ann')
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ann -> f ann'
f ann
a

instance HasAnnotation (Paragraph ann) (Paragraph ann) where
    annotation :: Lens
  (Paragraph ann)
  (Paragraph ann)
  (Annotation (Paragraph ann))
  (Annotation (Paragraph ann))
annotation = (Paragraph ann -> ann)
-> (Paragraph ann -> ann -> Paragraph ann)
-> Lens (Paragraph ann) (Paragraph ann) ann ann
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Paragraph ann -> ann
forall ann. Paragraph ann -> ann
paragraphAnnotation \Paragraph ann
x ann
a -> Paragraph ann
x{ paragraphAnnotation :: ann
paragraphAnnotation = ann
a }

instance HasContent (Paragraph ann) (Paragraph ann) where
    content :: Lens
  (Paragraph ann)
  (Paragraph ann)
  (Content (Paragraph ann))
  (Content (Paragraph ann))
content = (Paragraph ann -> Lines ann)
-> (Paragraph ann -> Lines ann -> Paragraph ann)
-> Lens (Paragraph ann) (Paragraph ann) (Lines ann) (Lines ann)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Paragraph ann -> Lines ann
forall ann. Paragraph ann -> Lines ann
paragraphContent (\Paragraph ann
t Lines ann
c -> Paragraph ann
t { paragraphContent :: Lines ann
paragraphContent = Lines ann
c })

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

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

instance HasManyMetadata (Paragraph ann) where
    allMetadata :: Traversal' (Paragraph ann) Metadata
allMetadata = Optic
  A_Lens NoIx (Paragraph ann) (Paragraph ann) (Lines ann) (Lines ann)
forall x x'. HasContent x x' => Lens x x' (Content x) (Content x')
content Optic
  A_Lens NoIx (Paragraph ann) (Paragraph ann) (Lines ann) (Lines ann)
-> Optic A_Traversal NoIx (Lines ann) (Lines ann) Metadata Metadata
-> Traversal' (Paragraph 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 (Lines ann) (Lines ann) Metadata Metadata
forall x. HasManyMetadata x => Traversal' x Metadata
allMetadata

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

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