{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveLift #-}

module Argo.Json.Value where

import Control.Applicative ((<|>))

import qualified Argo.Decoder as Decoder
import qualified Argo.Encoder as Encoder
import qualified Argo.Json.Array as Array
import qualified Argo.Json.Boolean as Boolean
import qualified Argo.Json.Null as Null
import qualified Argo.Json.Number as Number
import qualified Argo.Json.Object as Object
import qualified Argo.Json.String as String
import qualified Argo.Vendor.DeepSeq as DeepSeq
import qualified Argo.Vendor.TemplateHaskell as TH
import qualified GHC.Generics as Generics

data Value
    = Null Null.Null
    | Boolean Boolean.Boolean
    | Number Number.Number
    | String String.String
    | Array (Array.ArrayOf Value)
    | Object (Object.ObjectOf Value)
    deriving (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c== :: Value -> Value -> Bool
Eq, (forall x. Value -> Rep Value x)
-> (forall x. Rep Value x -> Value) -> Generic Value
forall x. Rep Value x -> Value
forall x. Value -> Rep Value x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Value x -> Value
$cfrom :: forall x. Value -> Rep Value x
Generics.Generic, Value -> Q Exp
Value -> Q (TExp Value)
(Value -> Q Exp) -> (Value -> Q (TExp Value)) -> Lift Value
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Value -> Q (TExp Value)
$cliftTyped :: Value -> Q (TExp Value)
lift :: Value -> Q Exp
$clift :: Value -> Q Exp
TH.Lift, Value -> ()
(Value -> ()) -> NFData Value
forall a. (a -> ()) -> NFData a
rnf :: Value -> ()
$crnf :: Value -> ()
DeepSeq.NFData, Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Value] -> ShowS
$cshowList :: [Value] -> ShowS
show :: Value -> String
$cshow :: Value -> String
showsPrec :: Int -> Value -> ShowS
$cshowsPrec :: Int -> Value -> ShowS
Show)

encode :: Value -> Encoder.Encoder ()
encode :: Value -> Encoder ()
encode Value
x = case Value
x of
    Null Null
y -> Null -> Encoder ()
Null.encode Null
y
    Boolean Boolean
y -> Boolean -> Encoder ()
Boolean.encode Boolean
y
    Number Number
y -> Number -> Encoder ()
Number.encode Number
y
    String String
y -> String -> Encoder ()
String.encode String
y
    Array ArrayOf Value
y -> (Value -> Encoder ()) -> ArrayOf Value -> Encoder ()
forall value. (value -> Encoder ()) -> ArrayOf value -> Encoder ()
Array.encode Value -> Encoder ()
encode ArrayOf Value
y
    Object ObjectOf Value
y -> (Value -> Encoder ()) -> ObjectOf Value -> Encoder ()
forall value. (value -> Encoder ()) -> ObjectOf value -> Encoder ()
Object.encode Value -> Encoder ()
encode ObjectOf Value
y

decode :: Decoder.Decoder Value
decode :: Decoder Value
decode =
    Null -> Value
Null (Null -> Value) -> Decoder Null -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Null
Null.decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Boolean -> Value
Boolean (Boolean -> Value) -> Decoder Boolean -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Boolean
Boolean.decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Number -> Value
Number (Number -> Value) -> Decoder Number -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Number
Number.decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Value
String (String -> Value) -> Decoder String -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder String
String.decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ArrayOf Value -> Value
Array (ArrayOf Value -> Value)
-> Decoder (ArrayOf Value) -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Value -> Decoder (ArrayOf Value)
forall value. Decoder value -> Decoder (ArrayOf value)
Array.decode Decoder Value
decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ObjectOf Value -> Value
Object (ObjectOf Value -> Value)
-> Decoder (ObjectOf Value) -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Value -> Decoder (ObjectOf Value)
forall value. Decoder value -> Decoder (ObjectOf value)
Object.decode Decoder Value
decode