packages feed

html-rules-0.1.0.0: src/Text/HTML/Rules/Types.hs

{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE Rank2Types #-}

{-|
Module      : Text.HTML.Rules.Types
Description : Ubiquitous types for html-rules.
Copyright   : (c) Kyle Carter, 2014
License     : BSD3
Maintainer  : kylcarte@gmail.com
Stability   : experimental
-}

module Text.HTML.Rules.Types where

import Control.Monad.State

import Text.HTML.TagSoup hiding (Tag)
import Text.HTML.TagSoup.Tree


-- | a single HTML Tree
type Fragment = TagTree String
-- | an HTML Forest
type HTML     = [Fragment]
-- | Tag name
type Name     = String
-- | Attribute name
type AttrKey  = String
-- | Attribute value
type AttrVal  = String
type Attrs    = [Attribute String]
-- | an HTML branch's descendents
type Desc     = HTML

-- | a 'Query' to decide when to apply a transformation,
--   paired with the 'Trans'formation.
--
--   NB: a Transformation makes
--   a single 'Fragment' into zero or more 'Fragment's.
type Rule  m a b = (Query m a, Trans m a b)

-- | a Rule over a 'Fragment' of HTML.
type FragmentRule m     = Rule m Fragment HTML

-- | a predicate on some type
type Query m a = a -> m Bool
-- | a predicate on an HTML Fragment
type FragmentQuery m = Query m Fragment

-- | a Transformation with a State of @a@
type Trans  m a b = StateT a m b
-- | a reflexive Transformation, analogous to @(a -> a)@
type Trans' m a   = Trans m a a

-- * Pattern Synonyms

-- | @Branch tg as ds = TagBranch tg as ds@
pattern Branch tg as ds = TagBranch tg as ds

-- | @Leaf tg as = TagLeaf (TagOpen tg as)@
pattern Leaf tg as = TagLeaf (TagOpen tg as)

-- | @Text t = TagLeaf (TagText t)@
pattern Text t = TagLeaf (TagText t)