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