module Text.XML.Basic.String where

import qualified Text.XML.Basic.Character as XMLChar
import qualified Text.XML.Basic.Entity as XMLEnt
import qualified Data.Map as Map
import qualified Data.Char as Char


-- | should be [Word8]
type Encoded  = String

{- |
Decode encoded characters and XML references.
Invalid references are silently skipped.
-}
decode ::
   (Encoded -> String) ->
   [XMLChar.T] ->
   String
decode =
   decodeGen XMLEnt.mapNameToChar

decodeGen ::
   Map.Map XMLEnt.Name Char ->
   (Encoded -> String) ->
   [XMLChar.T] ->
   String
decodeGen mapNameToChar decoder =
   foldr ($) [] .
   XMLChar.switchUnicodeRuns
      ((++) . decoder)
      (\n ->
         if XMLChar.validCharRef n
           then (Char.chr n :)
           else id)
      (\n ->
         maybe id (:) $
         Map.lookup n mapNameToChar)


{-
type Reference = Either Int String

data T = Cons String Reference R
data R = R Reference R | S T
-}