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

module Argo.Json.Array where

import qualified Argo.Decoder as Decoder
import qualified Argo.Encoder as Encoder
import qualified Argo.Literal as Literal
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 ArrayOf value
    = Array [value]
    deriving (ArrayOf value -> ArrayOf value -> Bool
(ArrayOf value -> ArrayOf value -> Bool)
-> (ArrayOf value -> ArrayOf value -> Bool) -> Eq (ArrayOf value)
forall value. Eq value => ArrayOf value -> ArrayOf value -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ArrayOf value -> ArrayOf value -> Bool
$c/= :: forall value. Eq value => ArrayOf value -> ArrayOf value -> Bool
== :: ArrayOf value -> ArrayOf value -> Bool
$c== :: forall value. Eq value => ArrayOf value -> ArrayOf value -> Bool
Eq, (forall x. ArrayOf value -> Rep (ArrayOf value) x)
-> (forall x. Rep (ArrayOf value) x -> ArrayOf value)
-> Generic (ArrayOf value)
forall x. Rep (ArrayOf value) x -> ArrayOf value
forall x. ArrayOf value -> Rep (ArrayOf value) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall value x. Rep (ArrayOf value) x -> ArrayOf value
forall value x. ArrayOf value -> Rep (ArrayOf value) x
$cto :: forall value x. Rep (ArrayOf value) x -> ArrayOf value
$cfrom :: forall value x. ArrayOf value -> Rep (ArrayOf value) x
Generics.Generic, ArrayOf value -> Q Exp
ArrayOf value -> Q (TExp (ArrayOf value))
(ArrayOf value -> Q Exp)
-> (ArrayOf value -> Q (TExp (ArrayOf value)))
-> Lift (ArrayOf value)
forall value. Lift value => ArrayOf value -> Q Exp
forall value.
Lift value =>
ArrayOf value -> Q (TExp (ArrayOf value))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: ArrayOf value -> Q (TExp (ArrayOf value))
$cliftTyped :: forall value.
Lift value =>
ArrayOf value -> Q (TExp (ArrayOf value))
lift :: ArrayOf value -> Q Exp
$clift :: forall value. Lift value => ArrayOf value -> Q Exp
TH.Lift, ArrayOf value -> ()
(ArrayOf value -> ()) -> NFData (ArrayOf value)
forall value. NFData value => ArrayOf value -> ()
forall a. (a -> ()) -> NFData a
rnf :: ArrayOf value -> ()
$crnf :: forall value. NFData value => ArrayOf value -> ()
DeepSeq.NFData, Int -> ArrayOf value -> ShowS
[ArrayOf value] -> ShowS
ArrayOf value -> String
(Int -> ArrayOf value -> ShowS)
-> (ArrayOf value -> String)
-> ([ArrayOf value] -> ShowS)
-> Show (ArrayOf value)
forall value. Show value => Int -> ArrayOf value -> ShowS
forall value. Show value => [ArrayOf value] -> ShowS
forall value. Show value => ArrayOf value -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ArrayOf value] -> ShowS
$cshowList :: forall value. Show value => [ArrayOf value] -> ShowS
show :: ArrayOf value -> String
$cshow :: forall value. Show value => ArrayOf value -> String
showsPrec :: Int -> ArrayOf value -> ShowS
$cshowsPrec :: forall value. Show value => Int -> ArrayOf value -> ShowS
Show)

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

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

encode :: (value -> Encoder.Encoder ()) -> ArrayOf value -> Encoder.Encoder ()
encode :: (value -> Encoder ()) -> ArrayOf 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 ())
-> (ArrayOf value -> [value]) -> ArrayOf value -> Encoder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArrayOf value -> [value]
forall value. ArrayOf value -> [value]
toList

decode :: Decoder.Decoder value -> Decoder.Decoder (ArrayOf value)
decode :: Decoder value -> Decoder (ArrayOf 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
    ArrayOf value -> Decoder (ArrayOf value)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ArrayOf value -> Decoder (ArrayOf value))
-> ArrayOf value -> Decoder (ArrayOf value)
forall a b. (a -> b) -> a -> b
$ [value] -> ArrayOf value
forall value. [value] -> ArrayOf value
fromList [value]
xs