{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE TypeSynonymInstances  #-}

module HaskellWorks.Data.Xml.Token.Tokenize
    ( IsChar(..)
    , XmlToken(..)
    , ParseXml(..)
    ) where

import Control.Applicative
import Data.Bits
import Data.Char
import Data.Word
import Data.Word8
import HaskellWorks.Data.Char.IsChar
import HaskellWorks.Data.Parser          as P
import HaskellWorks.Data.Xml.Token.Types

import qualified Data.Attoparsec.ByteString.Char8 as BC
import qualified Data.Attoparsec.Combinator       as AC
import qualified Data.Attoparsec.Types            as T
import qualified Data.ByteString                  as BS

hexDigitNumeric :: P.Parser t Word8 => T.Parser t Int
hexDigitNumeric :: Parser t Int
hexDigitNumeric = do
  Char
c <- (Char -> Bool) -> Parser t Char
forall t e. Parser t e => (Char -> Bool) -> Parser t Char
satisfyChar (\Char
c -> Char
'0' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9')
  Int -> Parser t Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser t Int) -> Int -> Parser t Int
forall a b. (a -> b) -> a -> b
$ Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'0'

hexDigitAlphaLower :: P.Parser t Word8 => T.Parser t Int
hexDigitAlphaLower :: Parser t Int
hexDigitAlphaLower = do
  Char
c <- (Char -> Bool) -> Parser t Char
forall t e. Parser t e => (Char -> Bool) -> Parser t Char
satisfyChar (\Char
c -> Char
'a' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'z')
  Int -> Parser t Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser t Int) -> Int -> Parser t Int
forall a b. (a -> b) -> a -> b
$ Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'a' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
10

hexDigitAlphaUpper :: P.Parser t Word8 => T.Parser t Int
hexDigitAlphaUpper :: Parser t Int
hexDigitAlphaUpper = do
  Char
c <- (Char -> Bool) -> Parser t Char
forall t e. Parser t e => (Char -> Bool) -> Parser t Char
satisfyChar (\Char
c -> Char
'A' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'Z')
  Int -> Parser t Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser t Int) -> Int -> Parser t Int
forall a b. (a -> b) -> a -> b
$ Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'A' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
10

hexDigit :: P.Parser t Word8 => T.Parser t Int
hexDigit :: Parser t Int
hexDigit = Parser t Int
forall t. Parser t Word8 => Parser t Int
hexDigitNumeric Parser t Int -> Parser t Int -> Parser t Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser t Int
forall t. Parser t Word8 => Parser t Int
hexDigitAlphaLower Parser t Int -> Parser t Int -> Parser t Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser t Int
forall t. Parser t Word8 => Parser t Int
hexDigitAlphaUpper

class ParseXml t s d where
  parseXmlTokenString     :: T.Parser t (XmlToken s d)
  parseXmlToken           :: T.Parser t (XmlToken s d)
  parseXmlTokenBraceL     :: T.Parser t (XmlToken s d)
  parseXmlTokenBraceR     :: T.Parser t (XmlToken s d)
  parseXmlTokenBracketL   :: T.Parser t (XmlToken s d)
  parseXmlTokenBracketR   :: T.Parser t (XmlToken s d)
  parseXmlTokenComma      :: T.Parser t (XmlToken s d)
  parseXmlTokenColon      :: T.Parser t (XmlToken s d)
  parseXmlTokenWhitespace :: T.Parser t (XmlToken s d)
  parseXmlTokenNull       :: T.Parser t (XmlToken s d)
  parseXmlTokenBoolean    :: T.Parser t (XmlToken s d)
  parseXmlTokenDouble     :: T.Parser t (XmlToken s d)

  parseXmlToken =
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenString     Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenBraceL     Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenBraceR     Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenBracketL   Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenBracketR   Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenComma      Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenColon      Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenWhitespace Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenNull       Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenBoolean    Parser t (XmlToken s d)
-> Parser t (XmlToken s d) -> Parser t (XmlToken s d)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
    Parser t (XmlToken s d)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlTokenDouble

instance ParseXml BS.ByteString String Double where
  parseXmlTokenBraceL :: Parser ByteString (XmlToken String Double)
parseXmlTokenBraceL   = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"{"      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenBraceL
  parseXmlTokenBraceR :: Parser ByteString (XmlToken String Double)
parseXmlTokenBraceR   = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"}"      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenBraceR
  parseXmlTokenBracketL :: Parser ByteString (XmlToken String Double)
parseXmlTokenBracketL = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"["      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenBracketL
  parseXmlTokenBracketR :: Parser ByteString (XmlToken String Double)
parseXmlTokenBracketR = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"]"      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenBracketR
  parseXmlTokenComma :: Parser ByteString (XmlToken String Double)
parseXmlTokenComma    = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
","      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenComma
  parseXmlTokenColon :: Parser ByteString (XmlToken String Double)
parseXmlTokenColon    = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
":"      Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenColon
  parseXmlTokenNull :: Parser ByteString (XmlToken String Double)
parseXmlTokenNull     = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"null"   Parser ByteString ByteString
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenNull
  parseXmlTokenDouble :: Parser ByteString (XmlToken String Double)
parseXmlTokenDouble   = Double -> XmlToken String Double
forall s d. d -> XmlToken s d
XmlTokenNumber (Double -> XmlToken String Double)
-> Parser ByteString Double
-> Parser ByteString (XmlToken String Double)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Double
forall t e f. (Parser t e, Fractional f) => Parser t f
rational

  parseXmlTokenString :: Parser ByteString (XmlToken String Double)
parseXmlTokenString = do
    ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\""
    String
value <- Parser ByteString Char -> Parser ByteString String
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString Char
verbatimChar Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Char
escapedChar Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Char
escapedCode)
    ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\""
    XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (XmlToken String Double
 -> Parser ByteString (XmlToken String Double))
-> XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall a b. (a -> b) -> a -> b
$ String -> XmlToken String Double
forall s d. s -> XmlToken s d
XmlTokenString String
value
    where
      verbatimChar :: Parser ByteString Char
verbatimChar  = (Char -> Bool) -> Parser ByteString Char
forall t e. Parser t e => (Char -> Bool) -> Parser t Char
satisfyChar (String -> Char -> Bool
BC.notInClass String
"\"\\") Parser ByteString Char -> String -> Parser ByteString Char
forall t e. Parser t e => Parser t Char -> String -> Parser t Char
<?> String
"invalid string character"
      escapedChar :: Parser ByteString Char
escapedChar   = do
        ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\\"
        (   Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'"'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'"'  ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'b'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\b' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'n'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\n' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'f'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\f' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'r'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\r' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
't'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\t' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'\\' Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\\' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'\'' Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\'' ) Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Char -> Parser ByteString Char
forall t e. Parser t e => Char -> Parser t Char
char Char
'/'  Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'/'  )
      escapedCode :: T.Parser BS.ByteString Char
      escapedCode :: Parser ByteString Char
escapedCode   = do
        ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\\u"
        Int
a <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
b <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
c <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
d <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Char -> Parser ByteString Char
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Parser ByteString Char)
-> (Int -> Char) -> Int -> Parser ByteString Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
chr (Int -> Parser ByteString Char) -> Int -> Parser ByteString Char
forall a b. (a -> b) -> a -> b
$ Int
a Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
24 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
b Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
16 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
c Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
8 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
d

  parseXmlTokenWhitespace :: Parser ByteString (XmlToken String Double)
parseXmlTokenWhitespace = do
    [ByteString]
_ <- Parser ByteString ByteString -> Parser ByteString [ByteString]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
AC.many1' (Parser ByteString ByteString -> Parser ByteString [ByteString])
-> Parser ByteString ByteString -> Parser ByteString [ByteString]
forall a b. (a -> b) -> a -> b
$ [Parser ByteString ByteString] -> Parser ByteString ByteString
forall (f :: * -> *) a. Alternative f => [f a] -> f a
BC.choice [ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
" ", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\t", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\n", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\r"]
    XmlToken String Double
-> Parser ByteString (XmlToken String Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken String Double
forall s d. XmlToken s d
XmlTokenWhitespace

  parseXmlTokenBoolean :: Parser ByteString (XmlToken String Double)
parseXmlTokenBoolean = Parser ByteString (XmlToken String Double)
forall s d. Parser ByteString (XmlToken s d)
true Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
-> Parser ByteString (XmlToken String Double)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString (XmlToken String Double)
forall s d. Parser ByteString (XmlToken s d)
false
    where
      true :: Parser ByteString (XmlToken s d)
true  = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"true"   Parser ByteString ByteString
-> Parser ByteString (XmlToken s d)
-> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken s d -> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> XmlToken s d
forall s d. Bool -> XmlToken s d
XmlTokenBoolean Bool
True)
      false :: Parser ByteString (XmlToken s d)
false = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"false"  Parser ByteString ByteString
-> Parser ByteString (XmlToken s d)
-> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken s d -> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> XmlToken s d
forall s d. Bool -> XmlToken s d
XmlTokenBoolean Bool
False)

instance ParseXml BS.ByteString BS.ByteString Double where
  parseXmlTokenBraceL :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenBraceL   = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"{"      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenBraceL
  parseXmlTokenBraceR :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenBraceR   = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"}"      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenBraceR
  parseXmlTokenBracketL :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenBracketL = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"["      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenBracketL
  parseXmlTokenBracketR :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenBracketR = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"]"      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenBracketR
  parseXmlTokenComma :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenComma    = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
","      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenComma
  parseXmlTokenColon :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenColon    = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
":"      Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenColon
  parseXmlTokenNull :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenNull     = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"null"   Parser ByteString ByteString
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenNull
  parseXmlTokenDouble :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenDouble   = Double -> XmlToken ByteString Double
forall s d. d -> XmlToken s d
XmlTokenNumber (Double -> XmlToken ByteString Double)
-> Parser ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Double
forall t e f. (Parser t e, Fractional f) => Parser t f
rational

  parseXmlTokenString :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenString = do
    ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\""
    [Word8]
value <- Parser ByteString Word8 -> Parser ByteString [Word8]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString Word8
verbatimChar Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Word8
escapedChar Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Word8
escapedCode)
    ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\""
    XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (XmlToken ByteString Double
 -> Parser ByteString (XmlToken ByteString Double))
-> (ByteString -> XmlToken ByteString Double)
-> ByteString
-> Parser ByteString (XmlToken ByteString Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> XmlToken ByteString Double
forall s d. s -> XmlToken s d
XmlTokenString (ByteString -> Parser ByteString (XmlToken ByteString Double))
-> ByteString -> Parser ByteString (XmlToken ByteString Double)
forall a b. (a -> b) -> a -> b
$ [Word8] -> ByteString
BS.pack [Word8]
value
    where
      word :: Word8 -> T.Parser BS.ByteString Word8
      word :: Word8 -> Parser ByteString Word8
word Word8
w = (Word8 -> Bool) -> Parser ByteString Word8
forall t e. Parser t e => (e -> Bool) -> Parser t e
satisfy (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
w)
      verbatimChar :: T.Parser BS.ByteString Word8
      verbatimChar :: Parser ByteString Word8
verbatimChar  = (Word8 -> Bool) -> Parser ByteString Word8
forall t e. Parser t e => (e -> Bool) -> Parser t e
satisfy (\Word8
w -> Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
_quotedbl Bool -> Bool -> Bool
&& Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
_backslash) -- <?> "invalid string character"
      escapedChar :: T.Parser BS.ByteString Word8
      escapedChar :: Parser ByteString Word8
escapedChar   = do
        ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\\"
        (   Word8 -> Parser ByteString Word8
word Word8
_quotedbl    Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_quotedbl       ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_b           Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
0x08            ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_n           Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_lf             ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_f           Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_np             ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_r           Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_cr             ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_t           Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_tab            ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_backslash   Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_backslash      ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_quotesingle Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_quotesingle    ) Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
          ( Word8 -> Parser ByteString Word8
word Word8
_slash       Parser ByteString Word8
-> Parser ByteString Word8 -> Parser ByteString Word8
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return Word8
_slash          )
      escapedCode :: T.Parser BS.ByteString Word8
      escapedCode :: Parser ByteString Word8
escapedCode   = do
        ByteString
_ <- ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\\u"
        Int
a <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
b <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
c <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Int
d <- Parser ByteString Int
forall t. Parser t Word8 => Parser t Int
hexDigit
        Word8 -> Parser ByteString Word8
forall (m :: * -> *) a. Monad m => a -> m a
return (Word8 -> Parser ByteString Word8)
-> (Int -> Word8) -> Int -> Parser ByteString Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Parser ByteString Word8) -> Int -> Parser ByteString Word8
forall a b. (a -> b) -> a -> b
$ Int
a Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
24 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
b Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
16 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
c Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
8 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
d

  parseXmlTokenWhitespace :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenWhitespace = do
    [ByteString]
_ <- Parser ByteString ByteString -> Parser ByteString [ByteString]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
AC.many1' (Parser ByteString ByteString -> Parser ByteString [ByteString])
-> Parser ByteString ByteString -> Parser ByteString [ByteString]
forall a b. (a -> b) -> a -> b
$ [Parser ByteString ByteString] -> Parser ByteString ByteString
forall (f :: * -> *) a. Alternative f => [f a] -> f a
BC.choice [ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
" ", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\t", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\n", ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"\r"]
    XmlToken ByteString Double
-> Parser ByteString (XmlToken ByteString Double)
forall (m :: * -> *) a. Monad m => a -> m a
return XmlToken ByteString Double
forall s d. XmlToken s d
XmlTokenWhitespace

  parseXmlTokenBoolean :: Parser ByteString (XmlToken ByteString Double)
parseXmlTokenBoolean = Parser ByteString (XmlToken ByteString Double)
forall s d. Parser ByteString (XmlToken s d)
true Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
-> Parser ByteString (XmlToken ByteString Double)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString (XmlToken ByteString Double)
forall s d. Parser ByteString (XmlToken s d)
false
    where
      true :: Parser ByteString (XmlToken s d)
true  = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"true"   Parser ByteString ByteString
-> Parser ByteString (XmlToken s d)
-> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken s d -> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> XmlToken s d
forall s d. Bool -> XmlToken s d
XmlTokenBoolean Bool
True)
      false :: Parser ByteString (XmlToken s d)
false = ByteString -> Parser ByteString ByteString
forall t e. Parser t e => t -> Parser t t
string ByteString
"false"  Parser ByteString ByteString
-> Parser ByteString (XmlToken s d)
-> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> XmlToken s d -> Parser ByteString (XmlToken s d)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> XmlToken s d
forall s d. Bool -> XmlToken s d
XmlTokenBoolean Bool
False)