    {-# LANGUAGE DeriveDataTypeable #-}

    -- ------------------------------------------------------------

    {- |
       Module     : Text.XML.HXT.DOM.TypeDefs
       Copyright  : Copyright (C) 2008 Uwe Schmidt
       License    : MIT

       Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
       Stability  : stable
       Portability: portable

       The core data types of the HXT DOM.

    -}

    -- ------------------------------------------------------------

    module Text.XML.HXT.DOM.TypeDefs
        ( module Data.AssocList
        , module Text.XML.HXT.DOM.TypeDefs
        , module Text.XML.HXT.DOM.QualifiedName
        )

    where

    import Control.DeepSeq

    import Data.AssocList
    import Data.Tree.NTree.TypeDefs
    import Data.Typeable

    import Text.XML.HXT.DOM.QualifiedName

    -- -----------------------------------------------------------------------------
    --
    -- Basic types for xml tree and filters

    -- | Node of xml tree representation

    type XmlTree	= NTree    XNode

    -- | List of nodes of xml tree representation

    type XmlTrees	= NTrees   XNode

    -- -----------------------------------------------------------------------------
    --
    -- XNode

    -- | Represents elements

    data XNode	= XText		  String			-- ^ ordinary text				(leaf)
    		| XCharRef	  Int				-- ^ character reference			(leaf)
    		| XEntityRef	  String			-- ^ entity reference				(leaf)
    		| XCmt		  String			-- ^ comment					(leaf)
    		| XCdata	  String			-- ^ CDATA section				(leaf)
    		| XPi		  QName XmlTrees		-- ^ Processing Instr with qualified name	(leaf)
    								--   with list of attributes.
    								--   If tag name is xml, attributs are \"version\", \"encoding\", \"standalone\",
    								--   else attribute list is empty, content is a text child node
    		| XTag		  QName XmlTrees		-- ^ tag with qualified name and list of attributes (inner node or leaf)
    		| XDTD		  DTDElem  Attributes		-- ^ DTD element with assoc list for dtd element features
    		| XAttr		  QName				-- ^ attribute with qualified name, the attribute value is stored in children
    		| XError	  Int  String			-- ^ error message with level and text
    		  deriving (Eq, Ord, Show, Read, Typeable)

    instance NFData XNode where
        rnf (XText s)		= rnf s
        rnf (XCharRef i)		= rnf i
        rnf (XEntityRef n)		= rnf n
        rnf (XCmt c)		= rnf c
        rnf (XCdata s)		= rnf s
        rnf (XPi qn ts)		= rnf qn `seq` rnf ts
        rnf (XTag qn cs)		= rnf qn `seq` rnf cs
        rnf (XDTD de al)		= rnf de `seq` rnf al
        rnf (XAttr qn)		= rnf qn
        rnf (XError n e)		= rnf n  `seq` rnf e

    -- -----------------------------------------------------------------------------
    --
    -- DTDElem

    -- | Represents a DTD element

    data DTDElem	= DOCTYPE	-- ^ attr: name, system, public,	XDTD elems as children
    		| ELEMENT	-- ^ attr: name, kind
    		                --
    				--  name: element name
    		                --
    				--  kind: \"EMPTY\" | \"ANY\" | \"\#PCDATA\" | children | mixed
    		| CONTENT	-- ^ element content
    		                --
    				--  attr: kind, modifier
    		                --
    				--  modifier: \"\" | \"?\" | \"*\" | \"+\"
    		                --
    				--  kind: seq | choice
    		| ATTLIST	-- ^ attributes:
    		                --  name - name of element
    		                --
    				--  value - name of attribute
    		                --
    				--  type: \"CDATA\" | \"ID\" | \"IDREF\" | \"IDREFS\" | \"ENTITY\" | \"ENTITIES\" |
    		                --
    				--        \"NMTOKEN\" | \"NMTOKENS\" |\"NOTATION\" | \"ENUMTYPE\"
    		                --
    				--  kind: \"#REQUIRED\" | \"#IMPLIED\" | \"DEFAULT\"
    		| ENTITY	-- ^ for entity declarations
    		| PENTITY	-- ^ for parameter entity declarations
    		| NOTATION	-- ^ for notations
    		| CONDSECT	-- ^ for INCLUDEs, IGNOREs and peRefs: attr: type
    		                --
    				--  type = INCLUDE, IGNORE or %...;
    		| NAME		-- ^ attr: name
    		                --
    				--  for lists of names in notation types or nmtokens in enumeration types
    		| PEREF		-- ^ for Parameter Entity References in DTDs
    		  deriving (Eq, Ord, Enum, Show, Read, Typeable)

    instance NFData DTDElem

    -- -----------------------------------------------------------------------------

    -- | Attribute list
    --
    -- used for storing option lists and features of DTD parts

    type Attributes	= AssocList String String

    -- -----------------------------------------------------------------------------
    --
    -- Constants for error levels

    -- | no error, everything is ok
    c_ok	:: Int
    c_ok	= 0

    -- | Error level for XError, type warning
    c_warn  :: Int
    c_warn  = c_ok + 1

    -- | Error level for XError, type error
    c_err   :: Int
    c_err   = c_warn + 1

    -- | Error level for XError, type fatal error
    c_fatal :: Int
    c_fatal = c_err + 1

    -- -----------------------------------------------------------------------------

    -- | data type for representing a set of nodes as a tree structure
    --
    -- this structure is e.g. used to repesent the result of an XPath query
    -- such that the selected nodes can be processed or selected later in
    -- processing a document tree

    data XmlNodeSet	= XNS { thisNode	:: Bool		-- ^ is this node part of the set ?
    		      , attrNodes	:: [QName]	-- ^ the set of attribute nodes
    		      , childNodes	:: ChildNodes	-- ^ the set of child nodes, a list of pairs of index and node set
    		      }
    		  deriving (Eq, Show, Typeable)

    type ChildNodes	= [(Int, XmlNodeSet)]

    -- -----------------------------------------------------------------------------