    {-|
    Module      : $Header$
    Description : Types and conversions
    Copyright   : (c) Justus Adam, 2015
    License     : BSD3
    Maintainer  : dev@justus.science
    Stability   : experimental
    Portability : POSIX

    escapeXML and xmlEntities curtesy to the tagsoup library.
    -}
    module Text.Mustache.Internal (uncons, escapeXMLText) where

    import           Data.Char   (ord)
    import qualified Data.IntMap as IntMap
    import qualified Data.Text   as T

    uncons :: [α] -> Maybe (α, [α])
    uncons []     = Nothing
    uncons (x:xs) = return (x, xs)

    escapeXMLText :: T.Text -> T.Text
    escapeXMLText = T.pack . escapeXML . T.unpack

    escapeXML :: String -> String
    escapeXML = concatMap $ \x -> IntMap.findWithDefault [x] (ord x) mp
        where mp = IntMap.fromList [(ord b, "&"++a++";") | (a,[b]) <- xmlEntities]

    xmlEntities :: [(String, String)]
    xmlEntities =
      [ ("quot", "\"")
      , ("#39", "'")
      , ("amp" , "&")
      , ("lt"  , "<")
      , ("gt"  , ">")
      ]