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

module Argo.Json.Member where

import qualified Argo.Json.Name as Name
import qualified Argo.Literal as Literal
import qualified Argo.Type.Config as Config
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

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

fromTuple :: (Name.Name, value) -> Member value
fromTuple :: (Name, value) -> Member value
fromTuple = (Name -> value -> Member value) -> (Name, value) -> Member value
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Name -> value -> Member value
forall value. Name -> value -> Member value
Member

toTuple :: Member value -> (Name.Name, value)
toTuple :: Member value -> (Name, value)
toTuple (Member Name
k value
v) = (Name
k, value
v)

encode :: (value -> Encoder.Encoder ()) -> Member value -> Encoder.Encoder ()
encode :: (value -> Encoder ()) -> Member value -> Encoder ()
encode value -> Encoder ()
f (Member Name
x value
y) = do
    Name -> Encoder ()
Name.encode Name
x
    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.colon
    Config
config <- ReaderT Config (WriterT Builder Identity) Config
forall (m :: * -> *) r. Monad m => ReaderT r m r
Trans.ask
    Bool -> Encoder () -> Encoder ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (Config -> Bool
Config.hasIndent Config
config)
        (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.space
    value -> Encoder ()
f value
y

decode :: Decoder.Decoder value -> Decoder.Decoder (Member value)
decode :: Decoder value -> Decoder (Member value)
decode Decoder value
g =
    Name -> value -> Member value
forall value. Name -> value -> Member value
Member
        (Name -> value -> Member value)
-> StateT ByteString (ExceptT String Identity) Name
-> StateT
     ByteString (ExceptT String Identity) (value -> Member value)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT ByteString (ExceptT String Identity) Name
Name.decode
        StateT ByteString (ExceptT String Identity) (value -> Member value)
-> StateT ByteString (ExceptT String Identity) ()
-> StateT
     ByteString (ExceptT String Identity) (value -> Member value)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Word8 -> StateT ByteString (ExceptT String Identity) ()
Decoder.word8 Word8
Literal.colon
        StateT ByteString (ExceptT String Identity) (value -> Member value)
-> StateT ByteString (ExceptT String Identity) ()
-> StateT
     ByteString (ExceptT String Identity) (value -> Member value)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT ByteString (ExceptT String Identity) ()
Decoder.spaces
        StateT ByteString (ExceptT String Identity) (value -> Member value)
-> Decoder value -> Decoder (Member value)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decoder value
g