{-# LANGUAGE PostfixOperators #-}

module Parsers.Json (json, nil, number, bool, string, array, object) where

import Parser(Parser(parse), exactly)
import ParserCombinators (IsMatch(..), (<|>), (>>>), (|*), (|?), maybeWithin)
import Parsers.Number (double)
import Parsers.Collections (listOf, mapOf)
import Parsers.Char (char, doubleQuote, colon)
import Parsers.String (withinDoubleQuotes, spacing)
import SyntaxTrees.Json (JsExpression(..))



nil :: Parser JsExpression
nil :: Parser JsExpression
nil = JsExpression
JsNull JsExpression -> Parser [Char] -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [Char] -> Parser [Char]
forall a. IsMatch a => a -> Parser a
is [Char]
"null"

number :: Parser JsExpression
number :: Parser JsExpression
number = Double -> JsExpression
JsNumber (Double -> JsExpression) -> Parser Double -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Double
double


bool :: Parser JsExpression
bool :: Parser JsExpression
bool = Bool -> JsExpression
JsBool (Bool -> JsExpression) -> Parser Bool -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Bool
True  Bool -> Parser [Char] -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [Char] -> Parser [Char]
forall a. IsMatch a => a -> Parser a
is [Char]
"true") Parser Bool -> Parser Bool -> Parser Bool
forall a. Parser a -> Parser a -> Parser a
<|>
                  (Bool
False Bool -> Parser [Char] -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [Char] -> Parser [Char]
forall a. IsMatch a => a -> Parser a
is [Char]
"false")


string :: Parser JsExpression
string :: Parser JsExpression
string = [Char] -> JsExpression
JsString ([Char] -> JsExpression) -> Parser [Char] -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser [Char]
text


array :: Parser JsExpression
array :: Parser JsExpression
array = [JsExpression] -> JsExpression
JsArray ([JsExpression] -> JsExpression)
-> Parser [JsExpression] -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser JsExpression -> Parser [JsExpression]
forall a. Parser a -> Parser [a]
listOf Parser JsExpression
json


object :: Parser JsExpression
object :: Parser JsExpression
object = Map [Char] JsExpression -> JsExpression
JsObject (Map [Char] JsExpression -> JsExpression)
-> Parser (Map [Char] JsExpression) -> Parser JsExpression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char
-> Parser [Char]
-> Parser JsExpression
-> Parser (Map [Char] JsExpression)
forall b a c.
Ord b =>
Parser a -> Parser b -> Parser c -> Parser (Map b c)
mapOf Parser Char
colon Parser [Char]
text Parser JsExpression
json


element :: Parser JsExpression
element :: Parser JsExpression
element = Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a
exactly Parser JsExpression
number Parser JsExpression -> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a -> Parser a
<|> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a
exactly Parser JsExpression
bool Parser JsExpression -> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a -> Parser a
<|> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a
exactly Parser JsExpression
nil Parser JsExpression -> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a -> Parser a
<|> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a
exactly Parser JsExpression
string

container :: Parser JsExpression
container :: Parser JsExpression
container = Parser JsExpression
array Parser JsExpression -> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a -> Parser a
<|> Parser JsExpression
object


json :: Parser JsExpression
json :: Parser JsExpression
json = Parser [Char] -> Parser JsExpression -> Parser JsExpression
forall a b. Parser a -> Parser b -> Parser b
maybeWithin Parser [Char]
spacing Parser JsExpression
jsValue where

  jsValue :: Parser JsExpression
jsValue = Parser JsExpression
element Parser JsExpression -> Parser JsExpression -> Parser JsExpression
forall a. Parser a -> Parser a -> Parser a
<|> Parser JsExpression
container


text :: Parser String
text :: Parser [Char]
text = Parser [Char] -> Parser [Char]
forall a. Parser a -> Parser a
withinDoubleQuotes (Parser Char -> Parser Char
forall a. IsMatch a => Parser a -> Parser a
inverse Parser Char
doubleQuote Parser Char -> Parser [Char]
forall a. Parser a -> Parser [a]
|*)