packages feed

argo-0.2022.2.27: source/library/Argo/Internal/Json/Array.hs

{-# 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 (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