module Composite.Aeson.Compat 
  ( CompositeFormat(..)
  ) where

import Composite.Aeson.Base (parseJsonWithFormat', toJsonWithFormat)
import Composite.Aeson.Formats.Default (DefaultJsonFormat(..))
import Data.Aeson (FromJSON(..), ToJSON(..))

newtype CompositeFormat a = CompositeFormat {forall a. CompositeFormat a -> a
unCompositeFormat :: a}

instance DefaultJsonFormat a => FromJSON (CompositeFormat a) where
  parseJSON :: Value -> Parser (CompositeFormat a)
parseJSON = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> CompositeFormat a
CompositeFormat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. JsonFormat Void a -> Value -> Parser a
parseJsonWithFormat' forall a e. DefaultJsonFormat a => JsonFormat e a
defaultJsonFormat

instance DefaultJsonFormat a => ToJSON (CompositeFormat a) where
  toJSON :: CompositeFormat a -> Value
toJSON = forall e a. JsonFormat e a -> a -> Value
toJsonWithFormat forall a e. DefaultJsonFormat a => JsonFormat e a
defaultJsonFormat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CompositeFormat a -> a
unCompositeFormat