{-# LANGUAGE DeriveLift #-}

module Argo.Internal.Json.Member where

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

data Member value = Member Name.Name value
    deriving (Member value -> Member value -> Bool
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 value (m :: * -> *).
(Lift value, Quote m) =>
Member value -> m Exp
forall value (m :: * -> *).
(Lift value, Quote m) =>
Member value -> Code m (Member value)
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => Member value -> m Exp
forall (m :: * -> *).
Quote m =>
Member value -> Code m (Member value)
liftTyped :: forall (m :: * -> *).
Quote m =>
Member value -> Code m (Member value)
$cliftTyped :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Member value -> Code m (Member value)
lift :: forall (m :: * -> *). Quote m => Member value -> m Exp
$clift :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Member value -> m Exp
TH.Lift, Int -> Member value -> ShowS
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)

instance DeepSeq.NFData value => DeepSeq.NFData (Member value) where
    rnf :: Member value -> ()
rnf = forall a. NFData a => a -> ()
DeepSeq.rnf forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. Member value -> (Name, value)
toTuple

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

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

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

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