{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} module Argo.Json.Array where import qualified Argo.Literal as Literal 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 GHC.Generics as Generics newtype Array value = Array [value] deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show) fromList :: [value] -> Array value fromList = Array toList :: Array value -> [value] toList (Array x) = x encode :: (value -> Encoder.Encoder ()) -> Array value -> Encoder.Encoder () encode f = Encoder.list (Trans.lift . Trans.tell $ Builder.word8 Literal.leftSquareBracket) (Trans.lift . Trans.tell $ Builder.word8 Literal.rightSquareBracket ) (Trans.lift . Trans.tell $ Builder.word8 Literal.comma) f . toList decode :: Decoder.Decoder value -> Decoder.Decoder (Array value) decode f = do Decoder.word8 Literal.leftSquareBracket Decoder.spaces xs <- Decoder.list f Decoder.word8 Literal.rightSquareBracket Decoder.spaces pure $ fromList xs