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

module Argo.Json.Object where

import qualified Argo.Decoder as Decoder
import qualified Argo.Encoder as Encoder
import qualified Argo.Json.Member as Member
import qualified Argo.Literal as Literal
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
import qualified GHC.Generics as Generics

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

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

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

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