module Argo.Type.Value where

import Control.Applicative ((<|>))

import qualified Argo.Decoder as Decoder
import qualified Argo.Type.Array as Array
import qualified Argo.Type.Boolean as Boolean
import qualified Argo.Type.Null as Null
import qualified Argo.Type.Number as Number
import qualified Argo.Type.Object as Object
import qualified Argo.Type.String as String
import qualified Control.DeepSeq as DeepSeq
import qualified Data.ByteString.Builder as Builder

data Value
    = Null Null.Null
    | Boolean Boolean.Boolean
    | Number Number.Number
    | String String.String
    | Array (Array.Array Value)
    | Object (Object.Object 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, 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)

instance DeepSeq.NFData Value where
    rnf :: Value -> ()
rnf Value
x = case Value
x of
        Null Null
y -> Null -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf Null
y
        Boolean Boolean
y -> Boolean -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf Boolean
y
        Number Number
y -> Number -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf Number
y
        String String
y -> String -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf String
y
        Array Array Value
y -> Array Value -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf Array Value
y
        Object Object Value
y -> Object Value -> ()
forall a. NFData a => a -> ()
DeepSeq.rnf Object Value
y

encode :: Value -> Builder.Builder
encode :: Value -> Builder
encode Value
x = case Value
x of
    Null Null
y -> Null -> Builder
Null.encode Null
y
    Boolean Boolean
y -> Boolean -> Builder
Boolean.encode Boolean
y
    Number Number
y -> Number -> Builder
Number.encode Number
y
    String String
y -> String -> Builder
String.encode String
y
    Array Array Value
y -> (Value -> Builder) -> Array Value -> Builder
forall a. (a -> Builder) -> Array a -> Builder
Array.encode Value -> Builder
encode Array Value
y
    Object Object Value
y -> (Value -> Builder) -> Object Value -> Builder
forall a. (a -> Builder) -> Object a -> Builder
Object.encode Value -> Builder
encode Object 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
<|> Array Value -> Value
Array (Array Value -> Value) -> Decoder (Array Value) -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Value -> Decoder (Array Value)
forall a. Decoder a -> Decoder (Array a)
Array.decode Decoder Value
decode
    Decoder Value -> Decoder Value -> Decoder Value
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Object Value -> Value
Object (Object Value -> Value) -> Decoder (Object Value) -> Decoder Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Value -> Decoder (Object Value)
forall a. Decoder a -> Decoder (Object a)
Object.decode Decoder Value
decode