module Text.XML.HXT.DTDValidation.TypeDefs
    ( module Text.XML.HXT.DTDValidation.TypeDefs
    , module Text.XML.HXT.DOM.Interface
    , module Text.XML.HXT.Arrow.XmlArrow
    , module Control.Arrow
    , module Control.Arrow.ArrowList
    , module Control.Arrow.ArrowIf
    , module Control.Arrow.ArrowState
    , module Control.Arrow.ArrowTree
    , module Control.Arrow.ListArrow
    , module Control.Arrow.StateListArrow
    )
where
import Control.Arrow                    
import Control.Arrow.ArrowList
import Control.Arrow.ArrowIf
import Control.Arrow.ArrowState
import Control.Arrow.ArrowTree
import Control.Arrow.ListArrow          
import Control.Arrow.StateListArrow
import Text.XML.HXT.Arrow.XmlArrow
import           Text.XML.HXT.DOM.Interface
infixr 0 $$
type XmlArrow   = LA XmlTree XmlTree
type XmlArrowS  = LA XmlTree XmlTrees
dtd_name
 , dtd_value
 , dtd_type
 , dtd_kind
 , dtd_modifier
 , dtd_default  :: Attributes -> String
dtd_name        = lookup1 a_name
dtd_value       = lookup1 a_value
dtd_type        = lookup1 a_type
dtd_kind        = lookup1 a_kind
dtd_modifier    = lookup1 a_modifier
dtd_default     = lookup1 a_default
isUnparsedEntity        :: ArrowDTD a => a XmlTree XmlTree
isUnparsedEntity        = filterA $
                          getDTDAttrl >>> isA (hasEntry k_ndata)
hasDTDAttrValue         :: ArrowDTD a => String -> (String -> Bool) -> a XmlTree XmlTree
hasDTDAttrValue an p    = filterA $
                          getDTDAttrl >>> isA (p . lookup1 an)
isRequiredAttrKind      :: ArrowDTD a => a XmlTree XmlTree
isRequiredAttrKind      = hasDTDAttrValue a_kind (== k_required)
isDefaultAttrKind       :: ArrowDTD a => a XmlTree XmlTree
isDefaultAttrKind       = hasDTDAttrValue a_kind (== k_default)
isFixedAttrKind         :: ArrowDTD a => a XmlTree XmlTree
isFixedAttrKind         = hasDTDAttrValue a_kind (== k_fixed)
isMixedContentElement   :: ArrowDTD a => a XmlTree XmlTree
isMixedContentElement   = hasDTDAttrValue a_type (== v_mixed)
isEmptyElement          :: ArrowDTD a => a XmlTree XmlTree
isEmptyElement          = hasDTDAttrValue a_type (== k_empty)
isEnumAttrType          :: ArrowDTD a => a XmlTree XmlTree
isEnumAttrType          = hasDTDAttrValue a_type (== k_enumeration)
isIdAttrType            :: ArrowDTD a => a XmlTree XmlTree
isIdAttrType            = hasDTDAttrValue a_type (== k_id)
isIdRefAttrType         :: ArrowDTD a => a XmlTree XmlTree
isIdRefAttrType         = hasDTDAttrValue a_type (`elem` [k_idref, k_idrefs])
isNotationAttrType      :: ArrowDTD a => a XmlTree XmlTree
isNotationAttrType      = hasDTDAttrValue a_type (== k_notation)
isAttlistOfElement      :: ArrowDTD a => String -> a XmlTree XmlTree
isAttlistOfElement el   = isDTDAttlist
                          >>>
                          hasDTDAttrValue a_name (== el)
valueOfDTD              :: String -> XmlTree -> String
valueOfDTD n            = concat . runLA ( getDTDAttrl >>^ lookup1 n )
valueOf                 :: String -> XmlTree -> String
valueOf n               = concat . runLA ( getAttrValue n )
getDTDAttributes        :: XmlTree -> Attributes
getDTDAttributes        = concat . runLA getDTDAttrl
isDTDDoctypeNode        :: XmlTree -> Bool
isDTDDoctypeNode        = not . null . runLA isDTDDoctype
isDTDElementNode        :: XmlTree -> Bool
isDTDElementNode        = not . null . runLA isDTDElement
isDTDAttlistNode        :: XmlTree -> Bool
isDTDAttlistNode        = not . null . runLA isDTDAttlist
isDTDContentNode        :: XmlTree -> Bool
isDTDContentNode        = not . null . runLA isDTDContent
isDTDNameNode           :: XmlTree -> Bool
isDTDNameNode           = not . null . runLA isDTDName
isElemNode              :: XmlTree -> Bool
isElemNode              = not . null . runLA isElem
nameOfAttr              :: XmlTree -> String
nameOfAttr              = concat . runLA (getAttrName >>^ qualifiedName)
nameOfElem              :: XmlTree -> String
nameOfElem              = concat . runLA (getElemName >>^ qualifiedName)
($$)            :: XmlArrow -> XmlTrees -> XmlTrees
f $$ l          = runLA (unlistA >>> f) l
msgToErr        :: (String -> String) -> LA String XmlTree
msgToErr f      = mkErr $< this
                  where
                  mkErr "" = none
                  mkErr s  = err (f s)