module Bookhound.Format.SyntaxTrees.Json (JsonExpression(..)) where

import Bookhound.Utils.Foldable (stringify)
import Bookhound.Utils.Map      (showMap)

import Data.Char (toLower)
import Data.Map  (Map)



data JsonExpression
  = JsNumber Double
  | JsBool Bool
  | JsString String
  | JsArray [JsonExpression]
  | JsObject (Map String JsonExpression)
  | JsNull
  deriving (JsonExpression -> JsonExpression -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JsonExpression -> JsonExpression -> Bool
$c/= :: JsonExpression -> JsonExpression -> Bool
== :: JsonExpression -> JsonExpression -> Bool
$c== :: JsonExpression -> JsonExpression -> Bool
Eq, Eq JsonExpression
JsonExpression -> JsonExpression -> Bool
JsonExpression -> JsonExpression -> Ordering
JsonExpression -> JsonExpression -> JsonExpression
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: JsonExpression -> JsonExpression -> JsonExpression
$cmin :: JsonExpression -> JsonExpression -> JsonExpression
max :: JsonExpression -> JsonExpression -> JsonExpression
$cmax :: JsonExpression -> JsonExpression -> JsonExpression
>= :: JsonExpression -> JsonExpression -> Bool
$c>= :: JsonExpression -> JsonExpression -> Bool
> :: JsonExpression -> JsonExpression -> Bool
$c> :: JsonExpression -> JsonExpression -> Bool
<= :: JsonExpression -> JsonExpression -> Bool
$c<= :: JsonExpression -> JsonExpression -> Bool
< :: JsonExpression -> JsonExpression -> Bool
$c< :: JsonExpression -> JsonExpression -> Bool
compare :: JsonExpression -> JsonExpression -> Ordering
$ccompare :: JsonExpression -> JsonExpression -> Ordering
Ord)


instance Show JsonExpression where
  show :: JsonExpression -> String
show = \case
    JsonExpression
JsNull       -> String
"null"
    JsNumber Double
n   -> forall a. Show a => a -> String
show Double
n
    JsBool Bool
bool  -> Char -> Char
toLower forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Show a => a -> String
show Bool
bool
    JsString String
str -> forall a. Show a => a -> String
show String
str
    JsArray [JsonExpression]
arr  -> forall (m :: * -> *).
Foldable m =>
String -> String -> String -> Int -> m String -> String
stringify String
",\n" String
"[\n" String
"\n]" Int
2 forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show   forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [JsonExpression]
arr
    JsObject Map String JsonExpression
obj -> forall (m :: * -> *).
Foldable m =>
String -> String -> String -> Int -> m String -> String
stringify String
",\n" String
"{\n" String
"\n}" Int
2 forall a b. (a -> b) -> a -> b
$ forall a.
String -> ShowS -> (a -> String) -> Map String a -> [String]
showMap String
": " forall a. a -> a
id forall a. Show a => a -> String
show Map String JsonExpression
obj