{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Jordan.FromJSON.Attoparsec
( convertParserToAttoparsecParser
, runParserViaAttoparsec
, parseViaAttoparsec
, attoparsecParser
) where
import Control.Applicative (Alternative(..))
import Data.Attoparsec.ByteString ((<?>))
import qualified Data.Attoparsec.ByteString as AP
import qualified Data.Attoparsec.ByteString.Char8 as CH
import Data.ByteString (ByteString)
import Data.Char (chr, digitToInt, isControl, isHexDigit, ord)
import Data.Functor (void, ($>))
import Data.Monoid (Alt(..))
import Data.Scientific (Scientific)
import qualified Data.Text as Text
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Jordan.FromJSON.Class
import Jordan.FromJSON.ParseInternal
import Numeric (showHex)
import qualified Text.Megaparsec as Text
newtype ObjectParser a
= ObjectParser
{ ObjectParser a -> Permutation Parser a
runObjectParser :: Permutation AP.Parser a }
deriving (a -> ObjectParser b -> ObjectParser a
(a -> b) -> ObjectParser a -> ObjectParser b
(forall a b. (a -> b) -> ObjectParser a -> ObjectParser b)
-> (forall a b. a -> ObjectParser b -> ObjectParser a)
-> Functor ObjectParser
forall a b. a -> ObjectParser b -> ObjectParser a
forall a b. (a -> b) -> ObjectParser a -> ObjectParser b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> ObjectParser b -> ObjectParser a
$c<$ :: forall a b. a -> ObjectParser b -> ObjectParser a
fmap :: (a -> b) -> ObjectParser a -> ObjectParser b
$cfmap :: forall a b. (a -> b) -> ObjectParser a -> ObjectParser b
Functor, Functor ObjectParser
a -> ObjectParser a
Functor ObjectParser
-> (forall a. a -> ObjectParser a)
-> (forall a b.
ObjectParser (a -> b) -> ObjectParser a -> ObjectParser b)
-> (forall a b c.
(a -> b -> c)
-> ObjectParser a -> ObjectParser b -> ObjectParser c)
-> (forall a b. ObjectParser a -> ObjectParser b -> ObjectParser b)
-> (forall a b. ObjectParser a -> ObjectParser b -> ObjectParser a)
-> Applicative ObjectParser
ObjectParser a -> ObjectParser b -> ObjectParser b
ObjectParser a -> ObjectParser b -> ObjectParser a
ObjectParser (a -> b) -> ObjectParser a -> ObjectParser b
(a -> b -> c) -> ObjectParser a -> ObjectParser b -> ObjectParser c
forall a. a -> ObjectParser a
forall a b. ObjectParser a -> ObjectParser b -> ObjectParser a
forall a b. ObjectParser a -> ObjectParser b -> ObjectParser b
forall a b.
ObjectParser (a -> b) -> ObjectParser a -> ObjectParser b
forall a b c.
(a -> b -> c) -> ObjectParser a -> ObjectParser b -> ObjectParser c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: ObjectParser a -> ObjectParser b -> ObjectParser a
$c<* :: forall a b. ObjectParser a -> ObjectParser b -> ObjectParser a
*> :: ObjectParser a -> ObjectParser b -> ObjectParser b
$c*> :: forall a b. ObjectParser a -> ObjectParser b -> ObjectParser b
liftA2 :: (a -> b -> c) -> ObjectParser a -> ObjectParser b -> ObjectParser c
$cliftA2 :: forall a b c.
(a -> b -> c) -> ObjectParser a -> ObjectParser b -> ObjectParser c
<*> :: ObjectParser (a -> b) -> ObjectParser a -> ObjectParser b
$c<*> :: forall a b.
ObjectParser (a -> b) -> ObjectParser a -> ObjectParser b
pure :: a -> ObjectParser a
$cpure :: forall a. a -> ObjectParser a
$cp1Applicative :: Functor ObjectParser
Applicative)
newtype ArrayParser a
= ArrayParser
{ ArrayParser a -> Parser a
runArrayParser :: AP.Parser a }
deriving (a -> ArrayParser b -> ArrayParser a
(a -> b) -> ArrayParser a -> ArrayParser b
(forall a b. (a -> b) -> ArrayParser a -> ArrayParser b)
-> (forall a b. a -> ArrayParser b -> ArrayParser a)
-> Functor ArrayParser
forall a b. a -> ArrayParser b -> ArrayParser a
forall a b. (a -> b) -> ArrayParser a -> ArrayParser b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> ArrayParser b -> ArrayParser a
$c<$ :: forall a b. a -> ArrayParser b -> ArrayParser a
fmap :: (a -> b) -> ArrayParser a -> ArrayParser b
$cfmap :: forall a b. (a -> b) -> ArrayParser a -> ArrayParser b
Functor)
instance Applicative ArrayParser where
pure :: a -> ArrayParser a
pure = Parser a -> ArrayParser a
forall a. Parser a -> ArrayParser a
ArrayParser (Parser a -> ArrayParser a)
-> (a -> Parser a) -> a -> ArrayParser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
ArrayParser (a -> b)
f <*> :: ArrayParser (a -> b) -> ArrayParser a -> ArrayParser b
<*> ArrayParser a
a = Parser b -> ArrayParser b
forall a. Parser a -> ArrayParser a
ArrayParser (Parser b -> ArrayParser b) -> Parser b -> ArrayParser b
forall a b. (a -> b) -> a -> b
$ do
a -> b
f' <- ArrayParser (a -> b) -> Parser (a -> b)
forall a. ArrayParser a -> Parser a
runArrayParser ArrayParser (a -> b)
f
Parser ()
comma
a
a' <- ArrayParser a -> Parser a
forall a. ArrayParser a -> Parser a
runArrayParser ArrayParser a
a
b -> Parser b
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> Parser b) -> b -> Parser b
forall a b. (a -> b) -> a -> b
$ a -> b
f' a
a'
skipSpace :: AP.Parser ()
skipSpace :: Parser ()
skipSpace = (Word8 -> Bool) -> Parser ()
AP.skipWhile Word8 -> Bool
isSpace
where
isSpace :: Word8 -> Bool
isSpace = \case
Word8
32 -> Bool
True
Word8
10 -> Bool
True
Word8
13 -> Bool
True
Word8
9 -> Bool
True
Word8
_ -> Bool
False
lexeme :: AP.Parser a -> AP.Parser a
lexeme :: Parser a -> Parser a
lexeme Parser a
a = Parser a
a Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
skipSpace
label :: String -> AP.Parser a -> AP.Parser a
label :: String -> Parser a -> Parser a
label String
l Parser a
p = Parser a
p Parser a -> String -> Parser a
forall i a. Parser i a -> String -> Parser i a
<?> String
l
parseAnyField :: AP.Parser ()
parseAnyField :: Parser ()
parseAnyField = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"junk field" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ do
Parser Text -> Parser Text
forall a. Parser a -> Parser a
lexeme Parser Text
parseJSONText
Parser ()
labelSep
Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme Parser ()
anyDatum
junkFieldAtEnd :: AP.Parser ()
junkFieldAtEnd :: Parser ()
junkFieldAtEnd = Parser ByteString [()] -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString [()] -> Parser ())
-> Parser ByteString [()] -> Parser ()
forall a b. (a -> b) -> a -> b
$ do
Parser ()
comma
Parser ()
parseAnyField Parser () -> Parser () -> Parser ByteString [()]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`AP.sepBy` Parser ()
comma
comma :: AP.Parser ()
comma :: Parser ()
comma = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"comma character" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString ByteString -> Parser ByteString ByteString
forall a. Parser a -> Parser a
lexeme (ByteString -> Parser ByteString ByteString
AP.string ByteString
",")
quotation :: AP.Parser ()
quotation :: Parser ()
quotation = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"quotation mark" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString Word8 -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString Word8 -> Parser ())
-> Parser ByteString Word8 -> Parser ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
34
parseJSONText :: AP.Parser Text.Text
parseJSONText :: Parser Text
parseJSONText = String -> Parser Text -> Parser Text
forall a. String -> Parser a -> Parser a
label String
"JSON text" (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ do
Parser ()
quotation
Parser Text
innerText
innerText :: AP.Parser Text.Text
innerText :: Parser Text
innerText = do
ByteString
chunk <- (Word8 -> Bool) -> Parser ByteString ByteString
AP.takeWhile ((Word8 -> Bool) -> Parser ByteString ByteString)
-> (Word8 -> Bool) -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ \Word8
char -> Word8
char Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
92 Bool -> Bool -> Bool
&& Word8
char Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
34
Maybe Word8
l <- Parser (Maybe Word8)
AP.peekWord8
case Maybe Word8
l of
Maybe Word8
Nothing -> String -> Parser Text
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"string without end"
Just Word8
34 -> do
Parser ByteString Word8
AP.anyWord8
Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Parser Text) -> Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
decodeUtf8 ByteString
chunk
Just Word8
92 -> do
Parser ByteString Word8
AP.anyWord8
Text
r <- String -> Parser Text -> Parser Text
forall a. String -> Parser a -> Parser a
label String
"escape value" Parser Text
parseEscape
Text
rest <- Parser Text
innerText
Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Parser Text) -> Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
decodeUtf8 ByteString
chunk Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
r Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
rest
Just Word8
_ -> String -> Parser Text
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"IMPOSSIBLE"
parseEscape :: AP.Parser Text.Text
parseEscape :: Parser Text
parseEscape
= Parser Text
quote
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
backslash
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
solidus
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
backspace
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
formfeed
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
linefeed
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
carriage
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
tab
Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
escaped
where
backslash :: Parser Text
backslash = ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\\"
quote :: Parser Text
quote = ByteString -> Parser ByteString ByteString
AP.string ByteString
"\"" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\""
solidus :: Parser Text
solidus = ByteString -> Parser ByteString ByteString
AP.string ByteString
"/" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"/"
backspace :: Parser Text
backspace = ByteString -> Parser ByteString ByteString
AP.string ByteString
"b" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\b"
formfeed :: Parser Text
formfeed = ByteString -> Parser ByteString ByteString
AP.string ByteString
"f" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\f"
linefeed :: Parser Text
linefeed = ByteString -> Parser ByteString ByteString
AP.string ByteString
"n" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\n"
carriage :: Parser Text
carriage = ByteString -> Parser ByteString ByteString
AP.string ByteString
"r" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\r"
tab :: Parser Text
tab = ByteString -> Parser ByteString ByteString
AP.string ByteString
"t" Parser ByteString ByteString -> Text -> Parser Text
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Text
"\t"
escaped :: Parser Text
escaped = do
ByteString -> Parser ByteString ByteString
AP.string ByteString
"u"
Int
a <- Parser Int
parseHexDigit
Int
b <- Parser Int
parseHexDigit
Int
c <- Parser Int
parseHexDigit
Int
d <- Parser Int
parseHexDigit
let s :: Int
s = (((Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
16) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
b) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
16 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
c) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
16 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
d
Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Parser Text) -> Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ String -> Text
Text.pack [Int -> Char
chr Int
s]
parseHexDigit :: AP.Parser Int
parseHexDigit :: Parser Int
parseHexDigit = String -> Parser Int -> Parser Int
forall a. String -> Parser a -> Parser a
label String
"hex digit" (Char -> Int
digitToInt (Char -> Int) -> Parser ByteString Char -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> Parser ByteString Char
CH.satisfy Char -> Bool
isHexDigit)
parseCharInText :: Char -> AP.Parser ()
parseCharInText :: Char -> Parser ()
parseCharInText Char
a = Char -> Parser ()
parseLit Char
a Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser ()
escaped Char
a
where
parseLit :: Char -> AP.Parser ()
parseLit :: Char -> Parser ()
parseLit = \case
Char
'\\' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\\\"
Char
'"' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\\""
Char
'/' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"/" Parser ByteString ByteString
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\/"
Char
'\b' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\b"
Char
'\f' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\f"
Char
'\n' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\n"
Char
'\r' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\r"
Char
'\t' -> Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
"\\t"
Char
a -> if Char -> Bool
isControl Char
a then Parser ()
forall (f :: * -> *) a. Alternative f => f a
empty else Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string (ByteString -> Parser ByteString ByteString)
-> ByteString -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
encodeUtf8 (Text -> ByteString) -> Text -> ByteString
forall a b. (a -> b) -> a -> b
$ Char -> Text
Text.singleton Char
a
escaped :: Char -> AP.Parser ()
escaped :: Char -> Parser ()
escaped Char
a = Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string (ByteString -> Parser ByteString ByteString)
-> ByteString -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
encodeUtf8 (Text -> ByteString) -> Text -> ByteString
forall a b. (a -> b) -> a -> b
$ String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String -> String
withEscaped (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Int -> String -> String
forall a. (Integral a, Show a) => a -> String -> String
showHex (Int -> String -> String) -> Int -> String -> String
forall a b. (a -> b) -> a -> b
$ Char -> Int
ord Char
a) []
withEscaped :: String -> String
withEscaped :: String -> String
withEscaped a :: String
a@[Char
_] = String
"\\u000" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
a
withEscaped a :: String
a@[Char
_,Char
_] = String
"\\u00" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
a
withEscaped a :: String
a@[Char
_,Char
_,Char
_] = String
"\\u0" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
a
withEscaped String
r = String
"\\u" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
r
objectKey :: Text.Text -> AP.Parser ()
objectKey :: Text -> Parser ()
objectKey Text
k = Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ do
Parser ()
quotation
(Char -> Parser () -> Parser ()) -> Parser () -> Text -> Parser ()
forall a. (Char -> a -> a) -> a -> Text -> a
Text.foldr (\Char
c Parser ()
a -> Char -> Parser ()
parseCharInText Char
c Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
a) (() -> Parser ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) Text
k
Parser ()
quotation
() -> Parser ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
startObject :: AP.Parser ()
startObject :: Parser ()
startObject
= String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"object starting brace ('{')"
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString Word8 -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void
(Parser ByteString Word8 -> Parser ())
-> Parser ByteString Word8 -> Parser ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
123
endObject :: AP.Parser ()
endObject :: Parser ()
endObject
= String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"object ending brace ('}')"
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString Word8 -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void
(Parser ByteString Word8 -> Parser ())
-> Parser ByteString Word8 -> Parser ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
125
inObjectBraces :: AP.Parser a -> AP.Parser a
inObjectBraces :: Parser a -> Parser a
inObjectBraces Parser a
interior = Parser ()
startObject Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
interior Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
endObject
startArray :: AP.Parser ()
startArray :: Parser ()
startArray
= String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"array starting brace ('[')"
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString Word8 -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void
(Parser ByteString Word8 -> Parser ())
-> Parser ByteString Word8 -> Parser ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
91
endArray :: AP.Parser ()
endArray :: Parser ()
endArray
= String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"array ending brace (']')"
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme
(Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString Word8 -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void
(Parser ByteString Word8 -> Parser ())
-> Parser ByteString Word8 -> Parser ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
93
labelSep :: AP.Parser ()
labelSep :: Parser ()
labelSep = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"key-value separator (':')" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString ByteString -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString ByteString -> Parser ())
-> Parser ByteString ByteString -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser ByteString ByteString -> Parser ByteString ByteString
forall a. Parser a -> Parser a
lexeme (Parser ByteString ByteString -> Parser ByteString ByteString)
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Parser ByteString ByteString
AP.string ByteString
":"
anyDatum :: AP.Parser ()
anyDatum :: Parser ()
anyDatum = Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme Parser ()
inner
where
inner :: Parser ()
inner
= AttoparsecParser () -> Parser ()
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser ()
forall (f :: * -> *). JSONParser f => f ()
parseNull
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Bool -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (AttoparsecParser Bool -> Parser ByteString Bool
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser Bool
forall (f :: * -> *). JSONParser f => f Bool
parseBool)
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (AttoparsecParser Text -> Parser Text
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser Text
forall (f :: * -> *). JSONParser f => f Text
parseText)
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Scientific -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (AttoparsecParser Scientific -> Parser ByteString Scientific
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser Scientific
forall (f :: * -> *). JSONParser f => f Scientific
parseNumber)
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Bool -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (AttoparsecParser Bool -> Parser ByteString Bool
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser Bool
forall (f :: * -> *). JSONParser f => f Bool
parseBool)
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ()
anyObject
Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ()
anyArray
anyArray :: AP.Parser ()
anyArray :: Parser ()
anyArray = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"ignored array" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ do
Parser ()
startArray
Parser ()
anyDatum Parser () -> Parser () -> Parser ByteString [()]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`AP.sepBy` Parser ()
comma
Parser ()
endArray
number :: AP.Parser Scientific
number :: Parser ByteString Scientific
number = Parser ByteString Scientific
CH.scientific
anyObject :: AP.Parser ()
anyObject :: Parser ()
anyObject = String -> Parser () -> Parser ()
forall a. String -> Parser a -> Parser a
label String
"ignored object" (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ do
Parser ()
startObject
(Parser () -> Parser () -> Parser ByteString [()])
-> Parser () -> Parser () -> Parser ByteString [()]
forall a b c. (a -> b -> c) -> b -> a -> c
flip Parser () -> Parser () -> Parser ByteString [()]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
AP.sepBy Parser ()
comma (Parser () -> Parser ByteString [()])
-> Parser () -> Parser ByteString [()]
forall a b. (a -> b) -> a -> b
$ do
Parser Text
parseJSONText
Parser ()
labelSep
Parser ()
anyDatum
Parser ()
endObject
parseObjectField
:: Text.Text
-> AP.Parser a
-> AP.Parser a
parseObjectField :: Text -> Parser a -> Parser a
parseObjectField Text
t Parser a
f = do
Text -> Parser ()
objectKey Text
t
Parser ()
labelSep
Parser a -> Parser a
forall a. Parser a -> Parser a
lexeme Parser a
f
parseDictField
:: AP.Parser a
-> AP.Parser (Text.Text, a)
parseDictField :: Parser a -> Parser (Text, a)
parseDictField Parser a
p = do
Text
key <- Parser Text
parseJSONText
Parser ()
labelSep
a
val <- Parser a
p
(Text, a) -> Parser (Text, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text
key, a
val)
instance JSONObjectParser ObjectParser where
parseFieldWith :: Text
-> (forall (valueParser :: * -> *).
JSONParser valueParser =>
valueParser a)
-> ObjectParser a
parseFieldWith Text
label
= Permutation Parser a -> ObjectParser a
forall a. Permutation Parser a -> ObjectParser a
ObjectParser
(Permutation Parser a -> ObjectParser a)
-> (AttoparsecParser a -> Permutation Parser a)
-> AttoparsecParser a
-> ObjectParser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser ByteString a -> Permutation Parser a
forall (f :: * -> *) a. Alternative f => f a -> Permutation f a
asPermutation
(Parser ByteString a -> Permutation Parser a)
-> (AttoparsecParser a -> Parser ByteString a)
-> AttoparsecParser a
-> Permutation Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Parser ByteString a -> Parser ByteString a
forall a. Text -> Parser a -> Parser a
parseObjectField Text
label
(Parser ByteString a -> Parser ByteString a)
-> (AttoparsecParser a -> Parser ByteString a)
-> AttoparsecParser a
-> Parser ByteString a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AttoparsecParser a -> Parser ByteString a
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser
newtype AttoparsecParser a
= AttoparsecParser
{ AttoparsecParser a -> Parser a
runAttoparsecParser :: AP.Parser a }
deriving (a -> AttoparsecParser b -> AttoparsecParser a
(a -> b) -> AttoparsecParser a -> AttoparsecParser b
(forall a b. (a -> b) -> AttoparsecParser a -> AttoparsecParser b)
-> (forall a b. a -> AttoparsecParser b -> AttoparsecParser a)
-> Functor AttoparsecParser
forall a b. a -> AttoparsecParser b -> AttoparsecParser a
forall a b. (a -> b) -> AttoparsecParser a -> AttoparsecParser b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> AttoparsecParser b -> AttoparsecParser a
$c<$ :: forall a b. a -> AttoparsecParser b -> AttoparsecParser a
fmap :: (a -> b) -> AttoparsecParser a -> AttoparsecParser b
$cfmap :: forall a b. (a -> b) -> AttoparsecParser a -> AttoparsecParser b
Functor)
deriving (b -> AttoparsecParser a -> AttoparsecParser a
NonEmpty (AttoparsecParser a) -> AttoparsecParser a
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
(AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a)
-> (NonEmpty (AttoparsecParser a) -> AttoparsecParser a)
-> (forall b.
Integral b =>
b -> AttoparsecParser a -> AttoparsecParser a)
-> Semigroup (AttoparsecParser a)
forall b.
Integral b =>
b -> AttoparsecParser a -> AttoparsecParser a
forall a. NonEmpty (AttoparsecParser a) -> AttoparsecParser a
forall a.
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b.
Integral b =>
b -> AttoparsecParser a -> AttoparsecParser a
stimes :: b -> AttoparsecParser a -> AttoparsecParser a
$cstimes :: forall a b.
Integral b =>
b -> AttoparsecParser a -> AttoparsecParser a
sconcat :: NonEmpty (AttoparsecParser a) -> AttoparsecParser a
$csconcat :: forall a. NonEmpty (AttoparsecParser a) -> AttoparsecParser a
<> :: AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
$c<> :: forall a.
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
Semigroup, Semigroup (AttoparsecParser a)
AttoparsecParser a
Semigroup (AttoparsecParser a)
-> AttoparsecParser a
-> (AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a)
-> ([AttoparsecParser a] -> AttoparsecParser a)
-> Monoid (AttoparsecParser a)
[AttoparsecParser a] -> AttoparsecParser a
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
forall a. Semigroup (AttoparsecParser a)
forall a. AttoparsecParser a
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [AttoparsecParser a] -> AttoparsecParser a
forall a.
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
mconcat :: [AttoparsecParser a] -> AttoparsecParser a
$cmconcat :: forall a. [AttoparsecParser a] -> AttoparsecParser a
mappend :: AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
$cmappend :: forall a.
AttoparsecParser a -> AttoparsecParser a -> AttoparsecParser a
mempty :: AttoparsecParser a
$cmempty :: forall a. AttoparsecParser a
$cp1Monoid :: forall a. Semigroup (AttoparsecParser a)
Monoid) via (Alt AP.Parser a)
instance JSONTupleParser ArrayParser where
consumeItemWith :: (forall (valueParser :: * -> *).
JSONParser valueParser =>
valueParser a)
-> ArrayParser a
consumeItemWith = Parser a -> ArrayParser a
forall a. Parser a -> ArrayParser a
ArrayParser (Parser a -> ArrayParser a)
-> (AttoparsecParser a -> Parser a)
-> AttoparsecParser a
-> ArrayParser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AttoparsecParser a -> Parser a
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser
instance JSONParser AttoparsecParser where
parseObject :: Text
-> (forall (objectParser :: * -> *).
JSONObjectParser objectParser =>
objectParser a)
-> AttoparsecParser a
parseObject Text
_ forall (objectParser :: * -> *).
JSONObjectParser objectParser =>
objectParser a
p = Parser a -> AttoparsecParser a
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser a -> AttoparsecParser a) -> Parser a -> AttoparsecParser a
forall a b. (a -> b) -> a -> b
$ Parser a -> Parser a
forall a. Parser a -> Parser a
inObjectBraces (Parser a -> Parser a) -> Parser a -> Parser a
forall a b. (a -> b) -> a -> b
$ do
a
r <- Parser () -> Parser () -> Permutation Parser a -> Parser a
forall (m :: * -> *) a b.
Alternative m =>
m b -> m b -> Permutation m a -> m a
wrapEffect Parser ()
parseAnyField Parser ()
comma (Permutation Parser a -> Parser a)
-> Permutation Parser a -> Parser a
forall a b. (a -> b) -> a -> b
$ ObjectParser a -> Permutation Parser a
forall a. ObjectParser a -> Permutation Parser a
runObjectParser ObjectParser a
forall (objectParser :: * -> *).
JSONObjectParser objectParser =>
objectParser a
p
String -> Parser ByteString [()] -> Parser ByteString [()]
forall a. String -> Parser a -> Parser a
label String
"junk object fields at the end of a parsed object" (Parser ByteString [()] -> Parser ByteString [()])
-> Parser ByteString [()] -> Parser ByteString [()]
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ByteString [()]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser ()
junkFieldAtEnd
a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
r
parseDictionary :: (forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a)
-> AttoparsecParser [(Text, a)]
parseDictionary forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a
parse = Parser [(Text, a)] -> AttoparsecParser [(Text, a)]
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser [(Text, a)] -> AttoparsecParser [(Text, a)])
-> Parser [(Text, a)] -> AttoparsecParser [(Text, a)]
forall a b. (a -> b) -> a -> b
$ Parser [(Text, a)] -> Parser [(Text, a)]
forall a. Parser a -> Parser a
inObjectBraces (Parser [(Text, a)] -> Parser [(Text, a)])
-> Parser [(Text, a)] -> Parser [(Text, a)]
forall a b. (a -> b) -> a -> b
$ do
Parser a -> Parser (Text, a)
forall a. Parser a -> Parser (Text, a)
parseDictField (AttoparsecParser a -> Parser a
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser a
forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a
parse) Parser (Text, a) -> Parser () -> Parser [(Text, a)]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`AP.sepBy` Parser ()
comma
parseTextConstant :: Text -> AttoparsecParser ()
parseTextConstant Text
c = Parser () -> AttoparsecParser ()
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Text -> Parser ()
objectKey Text
c Parser () -> String -> Parser ()
forall i a. Parser i a -> String -> Parser i a
<?> String
"text constant" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
Text.unpack Text
c)
parseText :: AttoparsecParser Text
parseText = Parser Text -> AttoparsecParser Text
forall a. Parser a -> AttoparsecParser a
AttoparsecParser Parser Text
parseJSONText
parseNumber :: AttoparsecParser Scientific
parseNumber = Parser ByteString Scientific -> AttoparsecParser Scientific
forall a. Parser a -> AttoparsecParser a
AttoparsecParser Parser ByteString Scientific
number
validateJSON :: AttoparsecParser (Either Text a) -> AttoparsecParser a
validateJSON AttoparsecParser (Either Text a)
v = Parser a -> AttoparsecParser a
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser a -> AttoparsecParser a) -> Parser a -> AttoparsecParser a
forall a b. (a -> b) -> a -> b
$ do
Either Text a
r <- AttoparsecParser (Either Text a) -> Parser (Either Text a)
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser (Either Text a)
v
case Either Text a
r of
Left Text
err -> String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (Text -> String
Text.unpack Text
err)
Right a
e -> a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
e
parseTuple :: (forall (arrayParser :: * -> *).
JSONTupleParser arrayParser =>
arrayParser o)
-> AttoparsecParser o
parseTuple forall (arrayParser :: * -> *).
JSONTupleParser arrayParser =>
arrayParser o
ap = Parser o -> AttoparsecParser o
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser o -> AttoparsecParser o) -> Parser o -> AttoparsecParser o
forall a b. (a -> b) -> a -> b
$ do
Parser ByteString Word8 -> Parser ByteString Word8
forall a. Parser a -> Parser a
lexeme (Parser ByteString Word8 -> Parser ByteString Word8)
-> Parser ByteString Word8 -> Parser ByteString Word8
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
91
o
r <- ArrayParser o -> Parser o
forall a. ArrayParser a -> Parser a
runArrayParser ArrayParser o
forall (arrayParser :: * -> *).
JSONTupleParser arrayParser =>
arrayParser o
ap
Parser ByteString Word8 -> Parser ByteString Word8
forall a. Parser a -> Parser a
lexeme (Parser ByteString Word8 -> Parser ByteString Word8)
-> Parser ByteString Word8 -> Parser ByteString Word8
forall a b. (a -> b) -> a -> b
$ Word8 -> Parser ByteString Word8
AP.word8 Word8
93
o -> Parser o
forall (f :: * -> *) a. Applicative f => a -> f a
pure o
r
parseArrayWith :: (forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a)
-> AttoparsecParser [a]
parseArrayWith forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a
jp = Parser [a] -> AttoparsecParser [a]
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser [a] -> AttoparsecParser [a])
-> Parser [a] -> AttoparsecParser [a]
forall a b. (a -> b) -> a -> b
$ do
Parser ()
startArray
[a]
r <- Parser a -> Parser a
forall a. Parser a -> Parser a
lexeme (AttoparsecParser a -> Parser a
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser a
forall (jsonParser :: * -> *).
JSONParser jsonParser =>
jsonParser a
jp) Parser a -> Parser () -> Parser [a]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`AP.sepBy` Parser ()
comma Parser [a] -> String -> Parser [a]
forall i a. Parser i a -> String -> Parser i a
<?> String
"array items"
Parser ()
endArray
[a] -> Parser [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [a]
r
parseBool :: AttoparsecParser Bool
parseBool = Parser ByteString Bool -> AttoparsecParser Bool
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser ByteString Bool -> AttoparsecParser Bool)
-> Parser ByteString Bool -> AttoparsecParser Bool
forall a b. (a -> b) -> a -> b
$ Parser ByteString Bool -> Parser ByteString Bool
forall a. Parser a -> Parser a
lexeme (Parser ByteString Bool -> Parser ByteString Bool)
-> Parser ByteString Bool -> Parser ByteString Bool
forall a b. (a -> b) -> a -> b
$
(ByteString -> Parser ByteString ByteString
AP.string ByteString
"true" Parser ByteString ByteString -> Bool -> Parser ByteString Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True) Parser ByteString Bool
-> Parser ByteString Bool -> Parser ByteString Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString ByteString
AP.string ByteString
"false" Parser ByteString ByteString -> Bool -> Parser ByteString Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
False)
parseNull :: AttoparsecParser ()
parseNull = Parser () -> AttoparsecParser ()
forall a. Parser a -> AttoparsecParser a
AttoparsecParser (Parser () -> AttoparsecParser ())
-> Parser () -> AttoparsecParser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall a. Parser a -> Parser a
lexeme (ByteString -> Parser ByteString ByteString
AP.string ByteString
"null" Parser ByteString ByteString -> () -> Parser ()
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ())
convertParserToAttoparsecParser :: (forall parser. JSONParser parser => parser a) -> AP.Parser a
convertParserToAttoparsecParser :: (forall (parser :: * -> *). JSONParser parser => parser a)
-> Parser a
convertParserToAttoparsecParser = (Parser ()
skipSpace Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>) (Parser a -> Parser a)
-> (AttoparsecParser a -> Parser a)
-> AttoparsecParser a
-> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AttoparsecParser a -> Parser a
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser
runParserViaAttoparsec :: (forall parser. JSONParser parser => parser a) -> ByteString -> Either String a
runParserViaAttoparsec :: (forall (parser :: * -> *). JSONParser parser => parser a)
-> ByteString -> Either String a
runParserViaAttoparsec forall (parser :: * -> *). JSONParser parser => parser a
p = Parser a -> ByteString -> Either String a
forall a. Parser a -> ByteString -> Either String a
AP.parseOnly ((forall (parser :: * -> *). JSONParser parser => parser a)
-> Parser a
forall a.
(forall (parser :: * -> *). JSONParser parser => parser a)
-> Parser a
convertParserToAttoparsecParser forall (parser :: * -> *). JSONParser parser => parser a
p)
parseViaAttoparsec :: (FromJSON val) => ByteString -> Either String val
parseViaAttoparsec :: ByteString -> Either String val
parseViaAttoparsec = Parser val -> ByteString -> Either String val
forall a. Parser a -> ByteString -> Either String a
AP.parseOnly (Parser ()
skipSpace Parser () -> Parser val -> Parser val
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AttoparsecParser val -> Parser val
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser val
forall value (f :: * -> *).
(FromJSON value, JSONParser f) =>
f value
fromJSON)
attoparsecParser :: (FromJSON val) => AP.Parser val
attoparsecParser :: Parser val
attoparsecParser = AttoparsecParser val -> Parser val
forall a. AttoparsecParser a -> Parser a
runAttoparsecParser AttoparsecParser val
forall value (f :: * -> *).
(FromJSON value, JSONParser f) =>
f value
fromJSON