module Text.XML.WraXML.String.HaXml where

import Text.XML.HaXml(AttValue(AttValue), Reference, )
import qualified Text.XML.HaXml as HaXml

import qualified Text.XML.WraXML.String  as XmlString
import qualified Text.XML.Basic.Character as XMLChar

import Data.Maybe.HT (alternatives, (?->), )


toXmlString :: AttValue -> XmlString.T
toXmlString (AttValue s) =
   concatMap (either XmlString.fromString ((:[]) . refToXmlAtom)) s

fromXmlString :: XmlString.T -> AttValue
fromXmlString =
   AttValue .
   XMLChar.switchUnicodeRuns
      Left
      (Right . HaXml.RefChar)
      (Right . HaXml.RefEntity)

lift :: (XmlString.T -> XmlString.T) -> (AttValue -> AttValue)
lift f = fromXmlString . f . toXmlString

refToXmlAtom :: HaXml.Reference -> XmlString.Atom
refToXmlAtom ref =
   case ref of
      HaXml.RefChar   num  -> XMLChar.fromCharRef   num
      HaXml.RefEntity name -> XMLChar.fromEntityRef name

charFromXmlAtom' :: XMLChar.T -> Either Char Reference
charFromXmlAtom' c =
   case c of
      XMLChar.Unicode   char -> Left char
      XMLChar.EntityRef name -> Right (HaXml.RefEntity name)
      XMLChar.CharRef   num  -> Right (HaXml.RefChar   num)

charFromXmlAtom :: XMLChar.T -> Either Char Reference
charFromXmlAtom c =
   alternatives
      (error "HaXml.charFromXmlAtom: unsupported constructor in XMLChar.T") $
      XMLChar.maybeUnicode   c ?-> Left :
      XMLChar.maybeEntityRef c ?-> Right . HaXml.RefEntity :
      XMLChar.maybeCharRef   c ?-> Right . HaXml.RefChar :
      []