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

module Argo.Json.Object where

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

newtype Object value
    = Object [Member.Member value]
    deriving (Object value -> Object value -> Bool
(Object value -> Object value -> Bool)
-> (Object value -> Object value -> Bool) -> Eq (Object value)
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 x. Object value -> Rep (Object value) x)
-> (forall x. Rep (Object value) x -> Object value)
-> Generic (Object value)
forall x. Rep (Object value) x -> Object value
forall x. Object value -> Rep (Object value) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall value x. Rep (Object value) x -> Object value
forall value x. Object value -> Rep (Object value) x
$cto :: forall value x. Rep (Object value) x -> Object value
$cfrom :: forall value x. Object value -> Rep (Object value) x
Generics.Generic, Object value -> Q Exp
Object value -> Q (TExp (Object value))
(Object value -> Q Exp)
-> (Object value -> Q (TExp (Object value))) -> Lift (Object value)
forall value. Lift value => Object value -> Q Exp
forall value. Lift value => Object value -> Q (TExp (Object value))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Object value -> Q (TExp (Object value))
$cliftTyped :: forall value. Lift value => Object value -> Q (TExp (Object value))
lift :: Object value -> Q Exp
$clift :: forall value. Lift value => Object value -> Q Exp
TH.Lift, Object value -> ()
(Object value -> ()) -> NFData (Object value)
forall value. NFData value => Object value -> ()
forall a. (a -> ()) -> NFData a
rnf :: Object value -> ()
$crnf :: forall value. NFData value => Object value -> ()
DeepSeq.NFData, Int -> Object value -> ShowS
[Object value] -> ShowS
Object value -> String
(Int -> Object value -> ShowS)
-> (Object value -> String)
-> ([Object value] -> ShowS)
-> Show (Object value)
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)

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

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

encode :: (value -> Encoder.Encoder ()) -> Object value -> Encoder.Encoder ()
encode :: (value -> Encoder ()) -> Object value -> Encoder ()
encode value -> Encoder ()
f =
    Encoder ()
-> Encoder ()
-> Encoder ()
-> (Member value -> Encoder ())
-> [Member 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 ()) -> Member value -> Encoder ()
forall value. (value -> Encoder ()) -> Member value -> Encoder ()
Member.encode value -> Encoder ()
f)
        ([Member value] -> Encoder ())
-> (Object value -> [Member value]) -> Object value -> Encoder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Object value -> [Member value]
forall value. Object value -> [Member value]
toList

encodeElement
    :: (value -> Encoder.Encoder ())
    -> Int
    -> Member.Member value
    -> Encoder.Encoder ()
encodeElement :: (value -> Encoder ()) -> Int -> Member value -> Encoder ()
encodeElement value -> Encoder ()
f Int
i Member 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 ()) -> Member value -> Encoder ()
forall value. (value -> Encoder ()) -> Member value -> Encoder ()
Member.encode value -> Encoder ()
f Member value
x

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