packages feed

pro-abstract-0.1.0.0: library/pro-abstract/ProAbstract/Structure/Document.hs

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
    { documentMetadata :: Metadata -- ^ 'ProAbstract.metadata'
    , documentContent :: Blocks ann -- ^ 'ProAbstract.content'
    }
  deriving stock (Eq, Show, Generic)
  deriving anyclass (Hashable, 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 documentContent (\d c -> d { documentContent = c })

instance HasContents (Document ann) (Document ann') where
    contents = content % contents

instance HasMetadata (Document ann) where
    type MetadataOpticKind (Document ann) = A_Lens
    metadata = lens documentMetadata (\d m -> d { documentMetadata = m })

instance HasManyPlainInlines (Document ann) where
    allPlainInlines = content % allPlainInlines

instance HasManyPlainBlocks (Document ann) where
    allPlainBlocks = content % allPlainBlocks

instance HasManyAnnotations (Document ann) (Document ann') where
    allAnnotations = content % allAnnotations

instance HasManyMetadata (Document ann) where
    allMetadata = metadata `adjoin` (content % allMetadata)

instance HasManyParagraphs (Document ann) where
    allParagraphs = content % allParagraphs

instance HasManyTags (Document ann) where
    allTags = content % allTags
    allInlineTags = content % allInlineTags

instance HasWitherableTags (Document ann) where
    witherTags f = traverseOf content (witherTags f)

instance HasManyBlockTags (Document ann) where
    allBlockTags = content % allBlockTags

instance HasWitherableBlockTags (Document ann) where
    witherBlockTags f = traverseOf content (witherBlockTags f)

instance HasWitherableInlineTags (Document ann) where
    witherInlineTags f = traverseOf content (witherInlineTags f)