{-# LANGUAGE DeriveLift #-}

module Argo.Internal.Json.Array where

import qualified Argo.Internal.Literal as Literal
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

newtype Array value
    = Array [value]
    deriving (Array value -> Array value -> Bool
forall value. Eq value => Array value -> Array value -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Array value -> Array value -> Bool
$c/= :: forall value. Eq value => Array value -> Array value -> Bool
== :: Array value -> Array value -> Bool
$c== :: forall value. Eq value => Array value -> Array value -> Bool
Eq, forall value (m :: * -> *).
(Lift value, Quote m) =>
Array value -> m Exp
forall value (m :: * -> *).
(Lift value, Quote m) =>
Array value -> Code m (Array value)
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => Array value -> m Exp
forall (m :: * -> *).
Quote m =>
Array value -> Code m (Array value)
liftTyped :: forall (m :: * -> *).
Quote m =>
Array value -> Code m (Array value)
$cliftTyped :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Array value -> Code m (Array value)
lift :: forall (m :: * -> *). Quote m => Array value -> m Exp
$clift :: forall value (m :: * -> *).
(Lift value, Quote m) =>
Array value -> m Exp
TH.Lift, Int -> Array value -> ShowS
forall value. Show value => Int -> Array value -> ShowS
forall value. Show value => [Array value] -> ShowS
forall value. Show value => Array value -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Array value] -> ShowS
$cshowList :: forall value. Show value => [Array value] -> ShowS
show :: Array value -> String
$cshow :: forall value. Show value => Array value -> String
showsPrec :: Int -> Array value -> ShowS
$cshowsPrec :: forall value. Show value => Int -> Array value -> ShowS
Show)

instance DeepSeq.NFData value => DeepSeq.NFData (Array value) where
    rnf :: Array value -> ()
rnf = forall a. NFData a => a -> ()
DeepSeq.rnf forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. Array value -> [value]
toList

fromList :: [value] -> Array value
fromList :: forall value. [value] -> Array value
fromList = forall value. [value] -> Array value
Array

toList :: Array value -> [value]
toList :: forall value. Array value -> [value]
toList (Array [value]
x) = [value]
x

encode :: (value -> Encoder.Encoder ()) -> Array value -> Encoder.Encoder ()
encode :: forall value. (value -> Encoder ()) -> Array value -> Encoder ()
encode value -> Encoder ()
f =
    forall a.
Encoder ()
-> Encoder ()
-> Encoder ()
-> (a -> Encoder ())
-> [a]
-> Encoder ()
Encoder.list
            (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.leftSquareBracket)
            (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.rightSquareBracket
            )
            (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.comma)
            value -> Encoder ()
f
        forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall value. Array value -> [value]
toList

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