{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
-- | Implementation of FromJSON parsers via Attoparsec.
--
-- This module does not construct intermediate data structures like maps or key-value lists,
-- and instead uses permutation parsers in order to parse your data structure directly.
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
$> ())

-- | Convert an abstract JSON parser to an Attoparsec Parser.
-- This function will skip leading whitespace.
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)

-- | Parse a ByteString via an Attoparsec Parser.
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)

-- | Get an Attoparsec parser for a particular JSON-parsable value.
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