    {-# 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)]

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