{-# LANGUAGE OverloadedStrings #-}

module SimpleParser.Examples.Json
  ( Json (..)
  , JsonF (..)
  , parseJson
  ) where

import Control.Applicative (empty)
import Control.Monad (void)
import Data.Char (isSpace)
import Data.Foldable (asum)
import Data.Text (Text)
import Data.Void (Void)
import SimpleParser

-- JSON without numbers...
data JsonF a =
    JsonObject ![(String, a)]
  | JsonArray ![a]
  | JsonString !String
  | JsonBool !Bool
  | JsonNull
  deriving (JsonF a -> JsonF a -> Bool
(JsonF a -> JsonF a -> Bool)
-> (JsonF a -> JsonF a -> Bool) -> Eq (JsonF a)
forall a. Eq a => JsonF a -> JsonF a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JsonF a -> JsonF a -> Bool
$c/= :: forall a. Eq a => JsonF a -> JsonF a -> Bool
== :: JsonF a -> JsonF a -> Bool
$c== :: forall a. Eq a => JsonF a -> JsonF a -> Bool
Eq, Int -> JsonF a -> ShowS
[JsonF a] -> ShowS
JsonF a -> String
(Int -> JsonF a -> ShowS)
-> (JsonF a -> String) -> ([JsonF a] -> ShowS) -> Show (JsonF a)
forall a. Show a => Int -> JsonF a -> ShowS
forall a. Show a => [JsonF a] -> ShowS
forall a. Show a => JsonF a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JsonF a] -> ShowS
$cshowList :: forall a. Show a => [JsonF a] -> ShowS
show :: JsonF a -> String
$cshow :: forall a. Show a => JsonF a -> String
showsPrec :: Int -> JsonF a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> JsonF a -> ShowS
Show, a -> JsonF b -> JsonF a
(a -> b) -> JsonF a -> JsonF b
(forall a b. (a -> b) -> JsonF a -> JsonF b)
-> (forall a b. a -> JsonF b -> JsonF a) -> Functor JsonF
forall a b. a -> JsonF b -> JsonF a
forall a b. (a -> b) -> JsonF a -> JsonF b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> JsonF b -> JsonF a
$c<$ :: forall a b. a -> JsonF b -> JsonF a
fmap :: (a -> b) -> JsonF a -> JsonF b
$cfmap :: forall a b. (a -> b) -> JsonF a -> JsonF b
Functor, JsonF a -> Bool
(a -> m) -> JsonF a -> m
(a -> b -> b) -> b -> JsonF a -> b
(forall m. Monoid m => JsonF m -> m)
-> (forall m a. Monoid m => (a -> m) -> JsonF a -> m)
-> (forall m a. Monoid m => (a -> m) -> JsonF a -> m)
-> (forall a b. (a -> b -> b) -> b -> JsonF a -> b)
-> (forall a b. (a -> b -> b) -> b -> JsonF a -> b)
-> (forall b a. (b -> a -> b) -> b -> JsonF a -> b)
-> (forall b a. (b -> a -> b) -> b -> JsonF a -> b)
-> (forall a. (a -> a -> a) -> JsonF a -> a)
-> (forall a. (a -> a -> a) -> JsonF a -> a)
-> (forall a. JsonF a -> [a])
-> (forall a. JsonF a -> Bool)
-> (forall a. JsonF a -> Int)
-> (forall a. Eq a => a -> JsonF a -> Bool)
-> (forall a. Ord a => JsonF a -> a)
-> (forall a. Ord a => JsonF a -> a)
-> (forall a. Num a => JsonF a -> a)
-> (forall a. Num a => JsonF a -> a)
-> Foldable JsonF
forall a. Eq a => a -> JsonF a -> Bool
forall a. Num a => JsonF a -> a
forall a. Ord a => JsonF a -> a
forall m. Monoid m => JsonF m -> m
forall a. JsonF a -> Bool
forall a. JsonF a -> Int
forall a. JsonF a -> [a]
forall a. (a -> a -> a) -> JsonF a -> a
forall m a. Monoid m => (a -> m) -> JsonF a -> m
forall b a. (b -> a -> b) -> b -> JsonF a -> b
forall a b. (a -> b -> b) -> b -> JsonF a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: JsonF a -> a
$cproduct :: forall a. Num a => JsonF a -> a
sum :: JsonF a -> a
$csum :: forall a. Num a => JsonF a -> a
minimum :: JsonF a -> a
$cminimum :: forall a. Ord a => JsonF a -> a
maximum :: JsonF a -> a
$cmaximum :: forall a. Ord a => JsonF a -> a
elem :: a -> JsonF a -> Bool
$celem :: forall a. Eq a => a -> JsonF a -> Bool
length :: JsonF a -> Int
$clength :: forall a. JsonF a -> Int
null :: JsonF a -> Bool
$cnull :: forall a. JsonF a -> Bool
toList :: JsonF a -> [a]
$ctoList :: forall a. JsonF a -> [a]
foldl1 :: (a -> a -> a) -> JsonF a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> JsonF a -> a
foldr1 :: (a -> a -> a) -> JsonF a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> JsonF a -> a
foldl' :: (b -> a -> b) -> b -> JsonF a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> JsonF a -> b
foldl :: (b -> a -> b) -> b -> JsonF a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> JsonF a -> b
foldr' :: (a -> b -> b) -> b -> JsonF a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> JsonF a -> b
foldr :: (a -> b -> b) -> b -> JsonF a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> JsonF a -> b
foldMap' :: (a -> m) -> JsonF a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> JsonF a -> m
foldMap :: (a -> m) -> JsonF a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> JsonF a -> m
fold :: JsonF m -> m
$cfold :: forall m. Monoid m => JsonF m -> m
Foldable, Functor JsonF
Foldable JsonF
Functor JsonF
-> Foldable JsonF
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> JsonF a -> f (JsonF b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    JsonF (f a) -> f (JsonF a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> JsonF a -> m (JsonF b))
-> (forall (m :: * -> *) a. Monad m => JsonF (m a) -> m (JsonF a))
-> Traversable JsonF
(a -> f b) -> JsonF a -> f (JsonF b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => JsonF (m a) -> m (JsonF a)
forall (f :: * -> *) a. Applicative f => JsonF (f a) -> f (JsonF a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> JsonF a -> m (JsonF b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> JsonF a -> f (JsonF b)
sequence :: JsonF (m a) -> m (JsonF a)
$csequence :: forall (m :: * -> *) a. Monad m => JsonF (m a) -> m (JsonF a)
mapM :: (a -> m b) -> JsonF a -> m (JsonF b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> JsonF a -> m (JsonF b)
sequenceA :: JsonF (f a) -> f (JsonF a)
$csequenceA :: forall (f :: * -> *) a. Applicative f => JsonF (f a) -> f (JsonF a)
traverse :: (a -> f b) -> JsonF a -> f (JsonF b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> JsonF a -> f (JsonF b)
$cp2Traversable :: Foldable JsonF
$cp1Traversable :: Functor JsonF
Traversable)

newtype Json = Json { Json -> JsonF Json
unJson :: JsonF Json } deriving (Json -> Json -> Bool
(Json -> Json -> Bool) -> (Json -> Json -> Bool) -> Eq Json
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Json -> Json -> Bool
$c/= :: Json -> Json -> Bool
== :: Json -> Json -> Bool
$c== :: Json -> Json -> Bool
Eq, Int -> Json -> ShowS
[Json] -> ShowS
Json -> String
(Int -> Json -> ShowS)
-> (Json -> String) -> ([Json] -> ShowS) -> Show Json
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Json] -> ShowS
$cshowList :: [Json] -> ShowS
show :: Json -> String
$cshow :: Json -> String
showsPrec :: Int -> Json -> ShowS
$cshowsPrec :: Int -> Json -> ShowS
Show)

type JsonParser a = Parser Void Text a

parseJson :: Text -> [Json]
parseJson :: Text -> [Json]
parseJson Text
str = do
  ParseResult ParseValue Void Json
v Text
_ <- Parser Void Text Json -> Text -> [ParseResult Void Text Json]
forall e s a. Parser e s a -> s -> [ParseResult e s a]
runParser (Parser Void Text Json
jsonParser Parser Void Text Json
-> ParserT Void Text Identity () -> Parser Void Text Json
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParserT Void Text Identity ()
forall s (m :: * -> *) e. (Stream s, Monad m) => ParserT e s m ()
matchEnd) Text
str
  case ParseValue Void Json
v of
    ParseSuccess Json
a -> Json -> [Json]
forall (f :: * -> *) a. Applicative f => a -> f a
pure Json
a

jsonSpace :: JsonParser ()
jsonSpace :: ParserT Void Text Identity ()
jsonSpace = ParserT Void Text Identity () -> ParserT Void Text Identity ()
forall (m :: * -> *) e s a.
Monad m =>
ParserT e s m a -> ParserT e s m ()
greedyStarParser_ (ParserT Void Text Identity Char -> ParserT Void Text Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ((Token Text -> Bool) -> ParserT Void Text Identity (Token Text)
forall s (m :: * -> *) e.
(Stream s, Monad m) =>
(Token s -> Bool) -> ParserT e s m (Token s)
satisfyToken Char -> Bool
Token Text -> Bool
isSpace))

jsonLexeme :: JsonParser () -> JsonParser a -> JsonParser a
jsonLexeme :: ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonLexeme ParserT Void Text Identity ()
spaceAfter JsonParser a
thing = do
  a
a <- JsonParser a
thing
  ParserT Void Text Identity ()
spaceAfter
  a -> JsonParser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a

jsonBetween :: JsonParser () -> JsonParser () -> JsonParser a -> JsonParser a
jsonBetween :: ParserT Void Text Identity ()
-> ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonBetween ParserT Void Text Identity ()
start ParserT Void Text Identity ()
end JsonParser a
thing = do
  ParserT Void Text Identity ()
start
  a
a <- JsonParser a
thing
  ParserT Void Text Identity ()
end
  a -> JsonParser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a

jsonSepBy :: JsonParser a -> JsonParser () -> JsonParser [a]
jsonSepBy :: JsonParser a -> ParserT Void Text Identity () -> JsonParser [a]
jsonSepBy JsonParser a
thing ParserT Void Text Identity ()
sep = [a] -> JsonParser [a]
go [] where
  optThing :: ParserT Void Text Identity (Maybe a)
optThing = JsonParser a -> ParserT Void Text Identity (Maybe a)
forall (m :: * -> *) e s a.
Monad m =>
ParserT e s m a -> ParserT e s m (Maybe a)
optionalParser JsonParser a
thing
  optSep :: ParserT Void Text Identity (Maybe ())
optSep = ParserT Void Text Identity ()
-> ParserT Void Text Identity (Maybe ())
forall (m :: * -> *) e s a.
Monad m =>
ParserT e s m a -> ParserT e s m (Maybe a)
optionalParser ParserT Void Text Identity ()
sep
  go :: [a] -> JsonParser [a]
go ![a]
acc = do
    Maybe a
ma <- ParserT Void Text Identity (Maybe a)
optThing
    case Maybe a
ma of
      Maybe a
Nothing -> if [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
acc then [a] -> JsonParser [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [] else JsonParser [a]
forall (f :: * -> *) a. Alternative f => f a
empty
      Just a
a -> do
        let newAcc :: [a]
newAcc = a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
acc
        Maybe ()
ms <- ParserT Void Text Identity (Maybe ())
optSep
        case Maybe ()
ms of
          Maybe ()
Nothing -> [a] -> JsonParser [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
newAcc)
          Just () -> [a] -> JsonParser [a]
go [a]
newAcc

jsonCharLexeme :: Char -> JsonParser ()
jsonCharLexeme :: Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
c = ParserT Void Text Identity Char -> ParserT Void Text Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParserT Void Text Identity ()
-> ParserT Void Text Identity Char
-> ParserT Void Text Identity Char
forall a.
ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonLexeme ParserT Void Text Identity ()
jsonSpace (Token Text -> ParserT Void Text Identity (Token Text)
forall s (m :: * -> *) e.
(Stream s, Monad m, Eq (Token s)) =>
Token s -> ParserT e s m (Token s)
matchToken Char
Token Text
c))

jsonWordLexeme :: Text -> JsonParser ()
jsonWordLexeme :: Text -> ParserT Void Text Identity ()
jsonWordLexeme Text
cs = ParserT Void Text Identity Text -> ParserT Void Text Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParserT Void Text Identity ()
-> ParserT Void Text Identity Text
-> ParserT Void Text Identity Text
forall a.
ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonLexeme ParserT Void Text Identity ()
jsonSpace (Chunk Text -> ParserT Void Text Identity (Chunk Text)
forall s (m :: * -> *) e.
(Stream s, Monad m, Eq (Chunk s)) =>
Chunk s -> ParserT e s m (Chunk s)
matchChunk Text
Chunk Text
cs))

openBrace, closeBrace, comma, colon, openBracket, closeBracket, closeQuote :: JsonParser ()
openBrace :: ParserT Void Text Identity ()
openBrace = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
'{'
closeBrace :: ParserT Void Text Identity ()
closeBrace = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
'}'
comma :: ParserT Void Text Identity ()
comma = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
','
colon :: ParserT Void Text Identity ()
colon = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
':'
openBracket :: ParserT Void Text Identity ()
openBracket = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
'['
closeBracket :: ParserT Void Text Identity ()
closeBracket = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
']'
closeQuote :: ParserT Void Text Identity ()
closeQuote = Char -> ParserT Void Text Identity ()
jsonCharLexeme Char
'"'

openQuote :: JsonParser ()
openQuote :: ParserT Void Text Identity ()
openQuote = ParserT Void Text Identity Char -> ParserT Void Text Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Token Text -> ParserT Void Text Identity (Token Text)
forall s (m :: * -> *) e.
(Stream s, Monad m, Eq (Token s)) =>
Token s -> ParserT e s m (Token s)
matchToken Char
Token Text
'"')

nullTok, trueTok, falseTok :: JsonParser ()
nullTok :: ParserT Void Text Identity ()
nullTok = Text -> ParserT Void Text Identity ()
jsonWordLexeme Text
"null"
trueTok :: ParserT Void Text Identity ()
trueTok = Text -> ParserT Void Text Identity ()
jsonWordLexeme Text
"true"
falseTok :: ParserT Void Text Identity ()
falseTok = Text -> ParserT Void Text Identity ()
jsonWordLexeme Text
"false"

nonQuoteChar :: JsonParser Char
nonQuoteChar :: ParserT Void Text Identity Char
nonQuoteChar = (Token Text -> Bool) -> ParserT Void Text Identity (Token Text)
forall s (m :: * -> *) e.
(Stream s, Monad m) =>
(Token s -> Bool) -> ParserT e s m (Token s)
satisfyToken (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'"')

nonQuoteString :: JsonParser String
nonQuoteString :: JsonParser String
nonQuoteString = ParserT Void Text Identity Char -> JsonParser String
forall (m :: * -> *) e s a.
Monad m =>
ParserT e s m a -> ParserT e s m [a]
greedyStarParser ParserT Void Text Identity Char
nonQuoteChar

rawStringParser :: JsonParser String
rawStringParser :: JsonParser String
rawStringParser = ParserT Void Text Identity ()
-> ParserT Void Text Identity ()
-> JsonParser String
-> JsonParser String
forall a.
ParserT Void Text Identity ()
-> ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonBetween ParserT Void Text Identity ()
openQuote ParserT Void Text Identity ()
closeQuote JsonParser String
nonQuoteString

-- TODO(ejconlon) This does not handle escape codes. Use `foldTokensWhile` for that...
stringParser :: JsonParser (JsonF a)
stringParser :: JsonParser (JsonF a)
stringParser = (String -> JsonF a) -> JsonParser String -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> JsonF a
forall a. String -> JsonF a
JsonString JsonParser String
rawStringParser

nullParser :: JsonParser (JsonF a)
nullParser :: JsonParser (JsonF a)
nullParser = JsonF a
forall a. JsonF a
JsonNull JsonF a -> ParserT Void Text Identity () -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParserT Void Text Identity ()
nullTok

boolParser :: JsonParser (JsonF a)
boolParser :: JsonParser (JsonF a)
boolParser = [JsonParser (JsonF a)] -> JsonParser (JsonF a)
forall (f :: * -> *) (m :: * -> *) e s a.
(Foldable f, Monad m) =>
f (ParserT e s m a) -> ParserT e s m a
branchParser [Bool -> JsonF a
forall a. Bool -> JsonF a
JsonBool Bool
True JsonF a -> ParserT Void Text Identity () -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParserT Void Text Identity ()
trueTok, Bool -> JsonF a
forall a. Bool -> JsonF a
JsonBool Bool
False JsonF a -> ParserT Void Text Identity () -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParserT Void Text Identity ()
falseTok]

objectPairParser :: JsonParser a -> JsonParser (String, a)
objectPairParser :: JsonParser a -> JsonParser (String, a)
objectPairParser JsonParser a
root = do
  String
name <- JsonParser String
rawStringParser
  ParserT Void Text Identity ()
colon
  a
value <- JsonParser a
root
  (String, a) -> JsonParser (String, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String
name, a
value)

objectParser :: JsonParser (String, a) -> JsonParser (JsonF a)
objectParser :: JsonParser (String, a) -> JsonParser (JsonF a)
objectParser JsonParser (String, a)
pairParser = ParserT Void Text Identity ()
-> ParserT Void Text Identity ()
-> JsonParser (JsonF a)
-> JsonParser (JsonF a)
forall a.
ParserT Void Text Identity ()
-> ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonBetween ParserT Void Text Identity ()
openBrace ParserT Void Text Identity ()
closeBrace (([(String, a)] -> JsonF a)
-> ParserT Void Text Identity [(String, a)] -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [(String, a)] -> JsonF a
forall a. [(String, a)] -> JsonF a
JsonObject (JsonParser (String, a)
-> ParserT Void Text Identity ()
-> ParserT Void Text Identity [(String, a)]
forall a.
JsonParser a -> ParserT Void Text Identity () -> JsonParser [a]
jsonSepBy JsonParser (String, a)
pairParser ParserT Void Text Identity ()
comma))

arrayParser :: JsonParser a -> JsonParser (JsonF a)
arrayParser :: JsonParser a -> JsonParser (JsonF a)
arrayParser JsonParser a
root = ParserT Void Text Identity ()
-> ParserT Void Text Identity ()
-> JsonParser (JsonF a)
-> JsonParser (JsonF a)
forall a.
ParserT Void Text Identity ()
-> ParserT Void Text Identity () -> JsonParser a -> JsonParser a
jsonBetween ParserT Void Text Identity ()
openBracket ParserT Void Text Identity ()
closeBracket (([a] -> JsonF a)
-> ParserT Void Text Identity [a] -> JsonParser (JsonF a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> JsonF a
forall a. [a] -> JsonF a
JsonArray (JsonParser a
-> ParserT Void Text Identity () -> ParserT Void Text Identity [a]
forall a.
JsonParser a -> ParserT Void Text Identity () -> JsonParser [a]
jsonSepBy JsonParser a
root ParserT Void Text Identity ()
comma))

rootParser :: JsonParser a -> JsonParser (JsonF a)
rootParser :: JsonParser a -> JsonParser (JsonF a)
rootParser JsonParser a
root = [JsonParser (JsonF a)] -> JsonParser (JsonF a)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [JsonParser (JsonF a)]
opts where
  pairParser :: JsonParser (String, a)
pairParser = JsonParser a -> JsonParser (String, a)
forall a. JsonParser a -> JsonParser (String, a)
objectPairParser JsonParser a
root
  opts :: [JsonParser (JsonF a)]
opts =
    [ JsonParser (String, a) -> JsonParser (JsonF a)
forall a. JsonParser (String, a) -> JsonParser (JsonF a)
objectParser JsonParser (String, a)
pairParser
    , JsonParser a -> JsonParser (JsonF a)
forall a. JsonParser a -> JsonParser (JsonF a)
arrayParser JsonParser a
root
    , JsonParser (JsonF a)
forall a. JsonParser (JsonF a)
stringParser
    , JsonParser (JsonF a)
forall a. JsonParser (JsonF a)
boolParser
    , JsonParser (JsonF a)
forall a. JsonParser (JsonF a)
nullParser
    ]

jsonParser :: JsonParser Json
jsonParser :: Parser Void Text Json
jsonParser = let p :: Parser Void Text Json
p = (JsonF Json -> Json)
-> ParserT Void Text Identity (JsonF Json) -> Parser Void Text Json
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap JsonF Json -> Json
Json (Parser Void Text Json -> ParserT Void Text Identity (JsonF Json)
forall a. JsonParser a -> JsonParser (JsonF a)
rootParser Parser Void Text Json
p) in Parser Void Text Json
p