{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# 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
import qualified GHC.Generics as Generics

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

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

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

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

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