{- |
   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) ]
                                                   )