{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE CPP #-}
module Text.Toml.Parser
( module Text.Toml.Parser
, module Text.Toml.Types
) where
import Control.Applicative hiding (many, optional, (<|>))
import Control.Monad
import qualified Data.HashMap.Strict as M
import qualified Data.List as L
import qualified Data.Set as S
import Data.Text (Text, pack, unpack)
import qualified Data.Vector as V
#if MIN_VERSION_time(1,5,0)
import Data.Time.Format (defaultTimeLocale, iso8601DateFormat,
parseTimeM)
#else
import Data.Time.Format (parseTime)
import System.Locale (defaultTimeLocale, iso8601DateFormat)
#endif
import Numeric (readHex)
import Text.Parsec
import Text.Toml.Types
import Prelude hiding (concat, takeWhile)
type Parser a = forall s. Parsec Text s a
parseOnly :: Parsec Text (S.Set [Text]) a -> Text -> Either ParseError a
parseOnly :: forall a. Parsec Text (Set [Text]) a -> Text -> Either ParseError a
parseOnly Parsec Text (Set [Text]) a
p Text
str = Parsec Text (Set [Text]) a
-> Set [Text] -> SourceName -> Text -> Either ParseError a
forall s t u a.
Stream s Identity t =>
Parsec s u a -> u -> SourceName -> s -> Either ParseError a
runParser (Parsec Text (Set [Text]) a
p Parsec Text (Set [Text]) a
-> ParsecT Text (Set [Text]) Identity ()
-> Parsec Text (Set [Text]) a
forall a b.
ParsecT Text (Set [Text]) Identity a
-> ParsecT Text (Set [Text]) Identity b
-> ParsecT Text (Set [Text]) Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text (Set [Text]) Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof) Set [Text]
forall a. Set a
S.empty SourceName
"test" Text
str
tomlDoc :: Parsec Text (S.Set [Text]) Table
tomlDoc :: Parsec Text (Set [Text]) Table
tomlDoc = do
ParsecT Text (Set [Text]) Identity ()
Parser ()
skipBlanks
Table
topTable <- Parsec Text (Set [Text]) Table
Parser Table
table
[([Text], Node)]
namedSections <- ParsecT Text (Set [Text]) Identity ([Text], Node)
-> ParsecT Text (Set [Text]) Identity [([Text], Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT Text (Set [Text]) Identity ([Text], Node)
Parser ([Text], Node)
namedSection
ParsecT Text (Set [Text]) Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
(Table -> ([Text], Node) -> Parsec Text (Set [Text]) Table)
-> Table -> [([Text], Node)] -> Parsec Text (Set [Text]) Table
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM ((([Text], Node) -> Table -> Parsec Text (Set [Text]) Table)
-> Table -> ([Text], Node) -> Parsec Text (Set [Text]) Table
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Explicitness
-> ([Text], Node) -> Table -> Parsec Text (Set [Text]) Table
insert Explicitness
Explicit)) Table
topTable [([Text], Node)]
namedSections
table :: Parser Table
table :: Parser Table
table = do
[(Text, Node)]
pairs <- ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity (Text, Node)
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text s Identity (Text, Node)
Parser (Text, Node)
assignment ParsecT Text s Identity (Text, Node)
-> ParsecT Text s Identity ()
-> ParsecT Text s Identity (Text, Node)
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity ()
Parser ()
skipBlanks)) ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity ()
Parser ()
skipBlanks ParsecT Text s Identity ()
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [(Text, Node)] -> ParsecT Text s Identity [(Text, Node)]
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return [])
case [Text] -> Maybe Text
forall a. Ord a => [a] -> Maybe a
maybeDupe (((Text, Node) -> Text) -> [(Text, Node)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Node) -> Text
forall a b. (a, b) -> a
fst [(Text, Node)]
pairs) of
Just Text
k -> SourceName -> Parsec Text s Table
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (SourceName -> Parsec Text s Table)
-> SourceName -> Parsec Text s Table
forall a b. (a -> b) -> a -> b
$ SourceName
"Cannot redefine key " SourceName -> SourceName -> SourceName
forall a. [a] -> [a] -> [a]
++ (Text -> SourceName
unpack Text
k)
Maybe Text
Nothing -> Table -> Parsec Text s Table
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Table -> Parsec Text s Table) -> Table -> Parsec Text s Table
forall a b. (a -> b) -> a -> b
$ [(Text, Node)] -> Table
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
M.fromList [(Text, Node)]
pairs
inlineTable :: Parser Node
inlineTable :: Parser Node
inlineTable = do
[(Text, Node)]
pairs <- ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}') (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [(Text, Node)]
forall {u}. ParsecT Text u Identity [(Text, Node)]
separatedValues ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces)
case [Text] -> Maybe Text
forall a. Ord a => [a] -> Maybe a
maybeDupe (((Text, Node) -> Text) -> [(Text, Node)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Node) -> Text
forall a b. (a, b) -> a
fst [(Text, Node)]
pairs) of
Just Text
k -> SourceName -> Parsec Text s Node
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (SourceName -> Parsec Text s Node)
-> SourceName -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ SourceName
"Cannot redefine key " SourceName -> SourceName -> SourceName
forall a. [a] -> [a] -> [a]
++ (Text -> SourceName
unpack Text
k)
Maybe Text
Nothing -> Node -> Parsec Text s Node
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> Parsec Text s Node) -> Node -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ Table -> Node
VTable (Table -> Node) -> Table -> Node
forall a b. (a -> b) -> a -> b
$ [(Text, Node)] -> Table
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
M.fromList [(Text, Node)]
pairs
where
skipSpaces :: ParsecT Text u Identity SourceName
skipSpaces = ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc)
separatedValues :: ParsecT Text u Identity [(Text, Node)]
separatedValues = ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [(Text, Node)]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text u Identity SourceName
-> ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity (Text, Node)
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity (Text, Node)
Parser (Text, Node)
assignment ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity (Text, Node)
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces) ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
comma
comma :: ParsecT Text u Identity SourceName
comma = ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces
maybeDupe :: Ord a => [a] -> Maybe a
maybeDupe :: forall a. Ord a => [a] -> Maybe a
maybeDupe [a]
xx = [a] -> Set a -> Maybe a
forall {a}. Ord a => [a] -> Set a -> Maybe a
dup [a]
xx Set a
forall a. Set a
S.empty
where
dup :: [a] -> Set a -> Maybe a
dup [] Set a
_ = Maybe a
forall a. Maybe a
Nothing
dup (a
x:[a]
xs) Set a
s = if a -> Set a -> Bool
forall a. Ord a => a -> Set a -> Bool
S.member a
x Set a
s then a -> Maybe a
forall a. a -> Maybe a
Just a
x else [a] -> Set a -> Maybe a
dup [a]
xs (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
S.insert a
x Set a
s)
namedSection :: Parser ([Text], Node)
namedSection :: Parser ([Text], Node)
namedSection = do
Either [Text] [Text]
eitherHdr <- ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([Text] -> Either [Text] [Text]
forall a b. a -> Either a b
Left ([Text] -> Either [Text] [Text])
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity (Either [Text] [Text])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity [Text]
Parser [Text]
tableHeader) ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([Text] -> Either [Text] [Text]
forall a b. b -> Either a b
Right ([Text] -> Either [Text] [Text])
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity (Either [Text] [Text])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity [Text]
Parser [Text]
tableArrayHeader)
Parsec Text s ()
Parser ()
skipBlanks
Table
tbl <- Parsec Text s Table
Parser Table
table
Parsec Text s ()
Parser ()
skipBlanks
([Text], Node) -> Parsec Text s ([Text], Node)
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Text], Node) -> Parsec Text s ([Text], Node))
-> ([Text], Node) -> Parsec Text s ([Text], Node)
forall a b. (a -> b) -> a -> b
$ case Either [Text] [Text]
eitherHdr of Left [Text]
ns -> ([Text]
ns, Table -> Node
VTable Table
tbl )
Right [Text]
ns -> ([Text]
ns, VTArray -> Node
VTArray (VTArray -> Node) -> VTArray -> Node
forall a b. (a -> b) -> a -> b
$ Table -> VTArray
forall a. a -> Vector a
V.singleton Table
tbl)
tableHeader :: Parser [Text]
= ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']') ParsecT Text s Identity [Text]
Parser [Text]
headerValue
tableArrayHeader :: Parser [Text]
= ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity SourceName
forall {s} {m :: * -> *} {u}.
Stream s m Char =>
Char -> ParsecT s u m SourceName
twoChar Char
'[') (Char -> ParsecT Text s Identity SourceName
forall {s} {m :: * -> *} {u}.
Stream s m Char =>
Char -> ParsecT s u m SourceName
twoChar Char
']') ParsecT Text s Identity [Text]
Parser [Text]
headerValue
where
twoChar :: Char -> ParsecT s u m SourceName
twoChar Char
c = Int -> ParsecT s u m Char -> ParsecT s u m SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
2 (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c)
headerValue :: Parser [Text]
= ((SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
keyChar) ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text
Parser Text
anyStr') ParsecT Text s Identity Text
-> ParsecT Text s Identity Char -> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy1` (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.')
where
keyChar :: ParsecT Text u Identity Char
keyChar = ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'
assignment :: Parser (Text, Node)
assignment :: Parser (Text, Node)
assignment = do
Text
k <- (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
keyChar) ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text
Parser Text
anyStr'
ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'=' ParsecT Text s Identity Char
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text s Identity ()
Parser ()
skipBlanks
Node
v <- Parsec Text s Node
Parser Node
value
(Text, Node) -> Parsec Text s (Text, Node)
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
k, Node
v)
where
keyChar :: ParsecT Text u Identity Char
keyChar = ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'
value :: Parser Node
value :: Parser Node
value = (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
array ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
boolean ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"boolean")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
anyStr ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"string")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
datetime ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"datetime")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
float ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"float")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
integer ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"integer")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
inlineTable ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"inline table")
array :: Parser Node
array :: Parser Node
array = (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
array) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of arrays")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
boolean) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of booleans")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
anyStr) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of strings")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
datetime) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of datetimes")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
float) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of floats")
ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
integer) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of integers")
boolean :: Parser Node
boolean :: Parser Node
boolean = Bool -> Node
VBoolean (Bool -> Node)
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName)
-> (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName
-> ParsecT Text s Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName -> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
"true") ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> ParsecT Text s Identity Bool
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True ParsecT Text s Identity Bool
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
(ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName)
-> (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName
-> ParsecT Text s Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName -> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
"false") ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> ParsecT Text s Identity Bool
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False )
anyStr :: Parser Node
anyStr :: Parser Node
anyStr = Text -> Node
VString (Text -> Node)
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Text
Parser Text
anyStr'
anyStr' :: Parser Text
anyStr' :: Parser Text
anyStr' = ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
multiBasicStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
basicStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
multiLiteralStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
literalStr
basicStr :: Parser Text
basicStr :: Parser Text
basicStr = ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity Text
-> ParsecT Text s Identity Text
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
dQuote ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
dQuote ((SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b.
(a -> b) -> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SourceName -> Text
pack (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
strChar)
where
strChar :: ParsecT Text u Identity Char
strChar = ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity Char
forall {u}. ParsecT Text u Identity Char
escSeq ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'"' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\\'))
dQuote :: ParsecT Text u Identity Char
dQuote = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\"'
multiBasicStr :: Parser Text
multiBasicStr :: Parser Text
multiBasicStr = (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
openDQuote3 ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [SourceName]
-> ParsecT Text s Identity [SourceName]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [SourceName]
forall {u}. ParsecT Text u Identity [SourceName]
escWhiteSpc ParsecT Text s Identity [SourceName]
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
strChar (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3)))
where
openDQuote3 :: ParsecT Text u Identity SourceName
openDQuote3 = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3 ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n') ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3
dQuote3 :: ParsecT Text u Identity SourceName
dQuote3 = Int
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
3 (ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
strChar :: ParsecT Text u Identity Char
strChar = (ParsecT Text u Identity Char
forall {u}. ParsecT Text u Identity Char
escSeq ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\\'))) ParsecT Text u Identity Char
-> ParsecT Text u Identity [SourceName]
-> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity [SourceName]
forall {u}. ParsecT Text u Identity [SourceName]
escWhiteSpc
escWhiteSpc :: ParsecT Text u Identity [SourceName]
escWhiteSpc = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [SourceName]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [SourceName])
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [SourceName]
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Bool
isSpc Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\n'))
literalStr :: Parser Text
literalStr :: Parser Text
literalStr = ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity Text
-> ParsecT Text s Identity Text
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
sQuote ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
sQuote (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\'')))
where
sQuote :: ParsecT Text u Identity Char
sQuote = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\''
multiLiteralStr :: Parser Text
multiLiteralStr :: Parser Text
multiLiteralStr = (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
openSQuote3 ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b.
(a -> b) -> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SourceName -> Text
pack (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3))
where
openSQuote3 :: ParsecT Text u Identity SourceName
openSQuote3 = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3 ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n') ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3
sQuote3 :: ParsecT Text u Identity SourceName
sQuote3 = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName)
-> (Char -> ParsecT Text u Identity SourceName)
-> Char
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
3 (ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName)
-> (Char -> ParsecT Text u Identity Char)
-> Char
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> ParsecT Text u Identity SourceName)
-> Char -> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ Char
'\''
datetime :: Parser Node
datetime :: Parser Node
datetime = do
SourceName
d <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'Z')
#if MIN_VERSION_time(1,5,0)
let mt :: Maybe UTCTime
mt = Bool -> TimeLocale -> SourceName -> SourceName -> Maybe UTCTime
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> SourceName -> SourceName -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale (Maybe SourceName -> SourceName
iso8601DateFormat (Maybe SourceName -> SourceName) -> Maybe SourceName -> SourceName
forall a b. (a -> b) -> a -> b
$ SourceName -> Maybe SourceName
forall a. a -> Maybe a
Just SourceName
"%X") SourceName
d
#else
let mt = parseTime defaultTimeLocale (iso8601DateFormat $ Just "%X") d
#endif
case Maybe UTCTime
mt of Just UTCTime
t -> Node -> Parsec Text s Node
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> Parsec Text s Node) -> Node -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ UTCTime -> Node
VDatetime UTCTime
t
Maybe UTCTime
Nothing -> SourceName -> Parsec Text s Node
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail SourceName
"parsing datetime failed"
float :: Parser Node
float :: Parser Node
float = Double -> Node
VFloat (Double -> Node)
-> ParsecT Text s Identity Double -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
SourceName
n <- ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
intStr ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'e' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'E'))
SourceName
d <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.') ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"0"
SourceName
e <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'e' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'E') ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
intStr) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"0"
Double -> ParsecT Text s Identity Double
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Double -> ParsecT Text s Identity Double)
-> ([SourceName] -> Double)
-> [SourceName]
-> ParsecT Text s Identity Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> Double
forall a. Read a => SourceName -> a
read (SourceName -> Double)
-> ([SourceName] -> SourceName) -> [SourceName] -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SourceName] -> SourceName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
L.concat ([SourceName] -> ParsecT Text s Identity Double)
-> [SourceName] -> ParsecT Text s Identity Double
forall a b. (a -> b) -> a -> b
$ [SourceName
n, SourceName
".", SourceName
d, SourceName
"e", SourceName
e]
where
sign :: ParsecT Text u Identity SourceName
sign = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"-") ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'+') ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"") ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
""
uintStr :: ParsecT Text u Identity SourceName
uintStr = (:) (Char -> SourceName -> SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity (SourceName -> SourceName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT Text u Identity (SourceName -> SourceName)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity (a -> b)
-> ParsecT Text u Identity a -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char -> ParsecT Text u Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_') ParsecT Text u Identity ()
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
intStr :: ParsecT Text u Identity SourceName
intStr = do SourceName
s <- ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sign
SourceName
u <- ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr
SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceName -> ParsecT Text u Identity SourceName)
-> ([SourceName] -> SourceName)
-> [SourceName]
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SourceName] -> SourceName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
L.concat ([SourceName] -> ParsecT Text u Identity SourceName)
-> [SourceName] -> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ [SourceName
s, SourceName
u]
integer :: Parser Node
integer :: Parser Node
integer = Int64 -> Node
VInteger (Int64 -> Node)
-> ParsecT Text s Identity Int64 -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Int64 -> Parser Int64
forall a. Num a => Parser a -> Parser a
signed (Parser Int64 -> Parser Int64) -> Parser Int64 -> Parser Int64
forall a b. (a -> b) -> a -> b
$ SourceName -> Int64
forall a. Read a => SourceName -> a
read (SourceName -> Int64)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr)
where
uintStr :: Parser [Char]
uintStr :: forall {u}. ParsecT Text u Identity SourceName
uintStr = (:) (Char -> SourceName -> SourceName)
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity (SourceName -> SourceName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT Text s Identity (SourceName -> SourceName)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity (a -> b)
-> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text s Identity Char -> ParsecT Text s Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_') ParsecT Text s Identity ()
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
arrayOf :: Parser Node -> Parser Node
arrayOf :: Parser Node -> Parser Node
arrayOf Parser Node
p = (VArray -> Node
VArray (VArray -> Node) -> ([Node] -> VArray) -> [Node] -> Node
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node] -> VArray
forall a. [a] -> Vector a
V.fromList) ([Node] -> Node)
-> ParsecT Text s Identity [Node] -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [Node]
-> ParsecT Text s Identity [Node]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']') (Parsec Text s ()
Parser ()
skipBlanks Parsec Text s ()
-> ParsecT Text s Identity [Node] -> ParsecT Text s Identity [Node]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [Node]
forall {u}. ParsecT Text u Identity [Node]
separatedValues)
where
separatedValues :: ParsecT Text u Identity [Node]
separatedValues = ParsecT Text u Identity Node
-> ParsecT Text u Identity () -> ParsecT Text u Identity [Node]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepEndBy (ParsecT Text u Identity ()
Parser ()
skipBlanks ParsecT Text u Identity ()
-> ParsecT Text u Identity Node -> ParsecT Text u Identity Node
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity Node -> ParsecT Text u Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity Node
Parser Node
p ParsecT Text u Identity Node
-> ParsecT Text u Identity () -> ParsecT Text u Identity Node
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity ()
Parser ()
skipBlanks) ParsecT Text u Identity ()
Parser ()
comma ParsecT Text u Identity [Node]
-> ParsecT Text u Identity () -> ParsecT Text u Identity [Node]
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity ()
Parser ()
skipBlanks
comma :: ParsecT Text s Identity ()
comma = ParsecT Text s Identity ()
Parser ()
skipBlanks ParsecT Text s Identity ()
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' ParsecT Text s Identity Char
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text s Identity ()
Parser ()
skipBlanks
escSeq :: Parser Char
escSeq :: forall {u}. ParsecT Text u Identity Char
escSeq = Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' ParsecT Text s Identity Char
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
escSeqChar
where
escSeqChar :: ParsecT Text u Identity Char
escSeqChar = ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'"'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\\'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'/') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'/'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'b') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\b'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
't') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\t'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'n') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\n'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'f') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\f'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'r') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\r'
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'u') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
4
ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'U') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
8
ParsecT Text u Identity Char
-> SourceName -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"escape character"
unicodeHex :: Int -> Parser Char
unicodeHex :: Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
n = do
SourceName
h <- Int -> Parsec Text s Char -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
n ((Char -> Bool) -> Parsec Text s Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isHex)
let v :: Int
v = (Int, SourceName) -> Int
forall a b. (a, b) -> a
fst ((Int, SourceName) -> Int)
-> (SourceName -> (Int, SourceName)) -> SourceName -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, SourceName)] -> (Int, SourceName)
forall a. HasCallStack => [a] -> a
head ([(Int, SourceName)] -> (Int, SourceName))
-> (SourceName -> [(Int, SourceName)])
-> SourceName
-> (Int, SourceName)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> [(Int, SourceName)]
forall a. (Eq a, Num a) => ReadS a
readHex (SourceName -> Int) -> SourceName -> Int
forall a b. (a -> b) -> a -> b
$ SourceName
h
Char -> Parsec Text s Char
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Parsec Text s Char) -> Char -> Parsec Text s Char
forall a b. (a -> b) -> a -> b
$ if Int
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxChar then Int -> Char
forall a. Enum a => Int -> a
toEnum Int
v else Char
'_'
where
isHex :: Char -> Bool
isHex Char
c = (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'0' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9') Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'A' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'Z') Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'a' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'z')
maxChar :: Int
maxChar = Char -> Int
forall a. Enum a => a -> Int
fromEnum (Char
forall a. Bounded a => a
maxBound :: Char)
signed :: Num a => Parser a -> Parser a
signed :: forall a. Num a => Parser a -> Parser a
signed Parser a
p = ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (a -> a
forall a. Num a => a -> a
negate (a -> a) -> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-' ParsecT Text s Identity Char
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity a
Parser a
p))
ParsecT Text s Identity a
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'+' ParsecT Text s Identity Char
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity a
Parser a
p)
ParsecT Text s Identity a
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity a
Parser a
p
skipBlanks :: Parser ()
skipBlanks :: Parser ()
skipBlanks = ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text s Identity ()
Parser ()
blank
where
blank :: ParsecT Text u Identity ()
blank = ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc) ParsecT Text u Identity SourceName
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text u Identity ()
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) ParsecT Text u Identity ()
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity ()
Parser ()
comment ParsecT Text u Identity ()
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity ()
Parser ()
eol
comment :: ParsecT Text u Identity ()
comment = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'#' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\n')) ParsecT Text u Identity SourceName
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text u Identity ()
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
isSpc :: Char -> Bool
isSpc :: Char -> Bool
isSpc Char
c = Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
' ' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\t'
eol :: Parser ()
eol :: Parser ()
eol = (SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"\n" ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"\r\n") ParsecT Text s Identity SourceName
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text s Identity ()
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()