{- |
Module : Composite.Aeson.Format.CofreeList
License : MIT
Stability : experimental
Format a Cofree [] as a JSON value with "head", "tail" keys.
-}
{-# LANGUAGE OverloadedStrings #-}
module Composite.Aeson.Format.CofreeList (
cofreeListJsonFormat
) where
import Composite.Aeson
import Composite.Aeson.WriteOnly
import Control.Comonad.Cofree
import Data.Aeson as A
import Data.Vector as V
cofreeListJsonFormat :: JsonFormat e a -> JsonFormat e (Cofree [] a)
cofreeListJsonFormat f = writeOnlyJsonFormat p where
p = \(x :< xs) -> object $ ["head" A..= toJsonWithFormat f x] <> (
case xs of
[] -> []
_ -> ["tail" A..= Array (V.fromList $ p <$> xs) ]
)