-- | basic 'Pattern' functions
--

module Text.XML.HXT.RelaxNG.PatternFunctions

where

import Text.XML.HXT.RelaxNG.DataTypes


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

isRelaxEmpty :: Pattern -> Bool
isRelaxEmpty Empty = True          
isRelaxEmpty _     = False

isRelaxNotAllowed :: Pattern -> Bool
isRelaxNotAllowed (NotAllowed _) = True          
isRelaxNotAllowed _              = False

isRelaxText :: Pattern -> Bool
isRelaxText Text = True          
isRelaxText _    = False

isRelaxChoice :: Pattern -> Bool
isRelaxChoice (Choice _ _) = True          
isRelaxChoice _            = False

isRelaxInterleave :: Pattern -> Bool
isRelaxInterleave (Interleave _ _) = True          
isRelaxInterleave _                = False

isRelaxGroup :: Pattern -> Bool
isRelaxGroup (Group _ _) = True          
isRelaxGroup _           = False

isRelaxOneOrMore :: Pattern -> Bool
isRelaxOneOrMore (OneOrMore _) = True          
isRelaxOneOrMore _             = False

isRelaxList :: Pattern -> Bool
isRelaxList (List _) = True          
isRelaxList _        = False

isRelaxData :: Pattern -> Bool
isRelaxData (Data _ _) = True          
isRelaxData _          = False

isRelaxDataExcept :: Pattern -> Bool
isRelaxDataExcept (DataExcept _ _ _) = True          
isRelaxDataExcept _                  = False

isRelaxValue :: Pattern -> Bool
isRelaxValue (Value _ _ _) = True          
isRelaxValue _             = False

isRelaxAttribute :: Pattern -> Bool
isRelaxAttribute (Attribute _ _) = True          
isRelaxAttribute _               = False

isRelaxElement :: Pattern -> Bool
isRelaxElement (Element _ _) = True          
isRelaxElement _             = False
             
isRelaxAfter :: Pattern -> Bool
isRelaxAfter (After _ _) = True          
isRelaxAfter _           = False


-- | Returns a list of children pattern for each pattern, 
-- e.g. (Choice p1 p2) = [p1, p2]
getChildrenPattern :: Pattern -> [Pattern]
getChildrenPattern (Choice p1 p2) = [p1, p2]
getChildrenPattern (Interleave p1 p2) = [p1, p2]
getChildrenPattern (Group p1 p2) = [p1, p2]
getChildrenPattern (OneOrMore p) = [p]
getChildrenPattern (List p) = [p]
getChildrenPattern (Element _ p) = [p]
getChildrenPattern (DataExcept _ _ p) = [p]
getChildrenPattern (Attribute _ p) = [p]
getChildrenPattern (After p1 p2) = [p1, p2]
getChildrenPattern _ = []


-- | Returns the nameclass of a element- or attribute pattern.
-- Otherwise 'NCError' is returned.
getNameClassFromPattern :: Pattern -> NameClass
getNameClassFromPattern (Element nc _) = nc
getNameClassFromPattern (Attribute nc _) = nc
getNameClassFromPattern _ = NCError "Pattern without a NameClass"


-- | Returns a string representation of the pattern name
getPatternName :: Pattern -> String
getPatternName (Empty) = "Empty"
getPatternName (NotAllowed _) = "NotAllowed"
getPatternName (Text) = "Text"
getPatternName (Choice _ _) = "Choice"
getPatternName (Interleave _ _) = "Interleave"
getPatternName (Group _ _) = "Group"
getPatternName (OneOrMore _) = "OneOrMore"
getPatternName (List _) = "List"
getPatternName (Data _ _ ) = "Data"
getPatternName (DataExcept _ _ _) = "DataExcept"
getPatternName (Value _ _ _) = "Value"
getPatternName (Attribute _ _) = "Attribute"
getPatternName (Element _ _) = "Element"
getPatternName (After _ _) = "After"