{-# LANGUAGE DeriveLift #-}

module Argo.Internal.Json.Object where

import qualified Argo.Internal.Json.Member as Member
import qualified Argo.Internal.Literal as Literal
import qualified Argo.Internal.Type.Decoder as Decoder
import qualified Argo.Internal.Type.Encoder as Encoder
import qualified Argo.Vendor.Builder as Builder
import qualified Argo.Vendor.DeepSeq as DeepSeq
import qualified Argo.Vendor.TemplateHaskell as TH
import qualified Argo.Vendor.Transformers as Trans
import qualified Control.Monad as Monad

newtype Object value
    = Object [Member.Member value]
    deriving (Object value -> Object value -> Bool
forall value. Eq value => Object value -> Object value -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Object value -> Object value -> Bool
$c/= :: forall value. Eq value => Object value -> Object value -> Bool
== :: Object value -> Object value -> Bool
$c== :: forall value. Eq value => Object value -> Object value -> Bool
Eq, forall value (m :: * -> *).
(Lift value, Quote m) =>
Object value -> m Exp
forall value (m :: * -> *).
(Lift value, Quote m) =>
Object value -> Code m (Object value)
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => Object value -> m Exp
forall (m :: * -> *).
Quote m =>
Object value -> Code m (Object value)
liftTyped :: forall (m :: * -> *).
Quote m =>
Object value -> Code m (Object value)
$cliftTyped :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Object value -> Code m (Object value)
lift :: forall (m :: * -> *). Quote m => Object value -> m Exp
$clift :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Object value -> m Exp
TH.Lift, Int -> Object value -> ShowS
forall value. Show value => Int -> Object value -> ShowS
forall value. Show value => [Object value] -> ShowS
forall value. Show value => Object value -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Object value] -> ShowS
$cshowList :: forall value. Show value => [Object value] -> ShowS
show :: Object value -> String
$cshow :: forall value. Show value => Object value -> String
showsPrec :: Int -> Object value -> ShowS
$cshowsPrec :: forall value. Show value => Int -> Object value -> ShowS
Show)

instance DeepSeq.NFData value => DeepSeq.NFData (Object value) where
    rnf :: Object value -> ()
rnf = forall a. NFData a => a -> ()
DeepSeq.rnf forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. Object value -> [Member value]
toList

fromList :: [Member.Member value] -> Object value
fromList :: forall value. [Member value] -> Object value
fromList = forall value. [Member value] -> Object value
Object

toList :: Object value -> [Member.Member value]
toList :: forall value. Object value -> [Member value]
toList (Object [Member value]
x) = [Member value]
x

encode :: (value -> Encoder.Encoder ()) -> Object value -> Encoder.Encoder ()
encode :: forall value. (value -> Encoder ()) -> Object value -> Encoder ()
encode value -> Encoder ()
f =
    forall a.
Encoder ()
-> Encoder ()
-> Encoder ()
-> (a -> Encoder ())
-> [a]
-> Encoder ()
Encoder.list
            (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
Trans.tell forall a b. (a -> b) -> a -> b
$ Word8 -> Builder
Builder.word8 Word8
Literal.leftCurlyBracket)
            (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
Trans.tell forall a b. (a -> b) -> a -> b
$ Word8 -> Builder
Builder.word8 Word8
Literal.rightCurlyBracket)
            (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
Trans.tell forall a b. (a -> b) -> a -> b
$ Word8 -> Builder
Builder.word8 Word8
Literal.comma)
            (forall value. (value -> Encoder ()) -> Member value -> Encoder ()
Member.encode value -> Encoder ()
f)
        forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. Object value -> [Member value]
toList

encodeElement
    :: (value -> Encoder.Encoder ())
    -> Int
    -> Member.Member value
    -> Encoder.Encoder ()
encodeElement :: forall value.
(value -> Encoder ()) -> Int -> Member value -> Encoder ()
encodeElement value -> Encoder ()
f Int
i Member value
x = do
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Int
i forall a. Ord a => a -> a -> Bool
> Int
0) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
Trans.tell forall a b. (a -> b) -> a -> b
$ Word8 -> Builder
Builder.word8 Word8
Literal.comma
    forall value. (value -> Encoder ()) -> Member value -> Encoder ()
Member.encode value -> Encoder ()
f Member value
x

decode :: Decoder.Decoder value -> Decoder.Decoder (Object value)
decode :: forall value. Decoder value -> Decoder (Object value)
decode Decoder value
f = do
    Word8 -> Decoder ()
Decoder.word8 Word8
Literal.leftCurlyBracket
    Decoder ()
Decoder.spaces
    [Member value]
xs <- forall a. Decoder a -> Decoder [a]
Decoder.list forall a b. (a -> b) -> a -> b
$ forall value. Decoder value -> Decoder (Member value)
Member.decode Decoder value
f
    Word8 -> Decoder ()
Decoder.word8 Word8
Literal.rightCurlyBracket
    Decoder ()
Decoder.spaces
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall value. [Member value] -> Object value
fromList [Member value]
xs