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

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

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

encode
    :: (value -> Encoder.Encoder ()) -> MemberOf value -> Encoder.Encoder ()
encode :: (value -> Encoder ()) -> MemberOf 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 (MemberOf value)
decode :: Decoder value -> Decoder (MemberOf value)
decode Decoder value
g =
    Name -> value -> MemberOf value
forall value. Name -> value -> MemberOf value
Member
        (Name -> value -> MemberOf value)
-> StateT ByteString (ExceptT String Identity) Name
-> StateT
     ByteString (ExceptT String Identity) (value -> MemberOf 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 -> MemberOf value)
-> StateT ByteString (ExceptT String Identity) ()
-> StateT
     ByteString (ExceptT String Identity) (value -> MemberOf 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 -> MemberOf value)
-> StateT ByteString (ExceptT String Identity) ()
-> StateT
     ByteString (ExceptT String Identity) (value -> MemberOf 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 -> MemberOf value)
-> Decoder value -> Decoder (MemberOf value)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Decoder value
g