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

import Bookhound.Parser              (Parser, withError)
import Bookhound.ParserCombinators   (IsMatch (..), maybeWithin, (<|>), (|*))
import Bookhound.Parsers.Char        (colon, doubleQuote)
import Bookhound.Parsers.Collections (listOf, mapOf)
import Bookhound.Parsers.Number      (double)
import Bookhound.Parsers.String      (spacing, withinDoubleQuotes)

import Bookhound.Format.SyntaxTrees.Json (JsonExpression (..))


json :: Parser JsonExpression
json :: Parser JsonExpression
json = forall a b. Parser a -> Parser b -> Parser b
maybeWithin Parser String
spacing Parser JsonExpression
jsValue
  where
    jsValue :: Parser JsonExpression
jsValue = Parser JsonExpression
element forall a. Parser a -> Parser a -> Parser a
<|> Parser JsonExpression
container


nil :: Parser JsonExpression
nil :: Parser JsonExpression
nil = forall a. String -> Parser a -> Parser a
withError String
"Json Null" forall a b. (a -> b) -> a -> b
$
  JsonExpression
JsNull forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a. IsMatch a => a -> Parser a
is String
"null"

number :: Parser JsonExpression
number :: Parser JsonExpression
number = forall a. String -> Parser a -> Parser a
withError String
"Json Number" forall a b. (a -> b) -> a -> b
$
  Double -> JsonExpression
JsNumber forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Double
double


bool :: Parser JsonExpression
bool :: Parser JsonExpression
bool = forall a. String -> Parser a -> Parser a
withError String
"Json Bool" forall a b. (a -> b) -> a -> b
$
  Bool -> JsonExpression
JsBool forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Bool
True  forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a. IsMatch a => a -> Parser a
is String
"true" forall a. Parser a -> Parser a -> Parser a
<|>
              Bool
False forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a. IsMatch a => a -> Parser a
is String
"false")


string :: Parser JsonExpression
string :: Parser JsonExpression
string = forall a. String -> Parser a -> Parser a
withError String
"Json String" forall a b. (a -> b) -> a -> b
$
  String -> JsonExpression
JsString forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
text


array :: Parser JsonExpression
array :: Parser JsonExpression
array = forall a. String -> Parser a -> Parser a
withError String
"Json Array" forall a b. (a -> b) -> a -> b
$
  [JsonExpression] -> JsonExpression
JsArray forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Parser a -> Parser [a]
listOf Parser JsonExpression
json


object :: Parser JsonExpression
object :: Parser JsonExpression
object = forall a. String -> Parser a -> Parser a
withError String
"Json Object" forall a b. (a -> b) -> a -> b
$
  Map String JsonExpression -> JsonExpression
JsObject forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall b a c.
Ord b =>
Parser a -> Parser b -> Parser c -> Parser (Map b c)
mapOf Parser Char
colon Parser String
text Parser JsonExpression
json


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

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


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