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 :
      []