module Autodocodec.DerivingVia where
import Autodocodec.Aeson.Decode (parseJSONViaCodec)
import Autodocodec.Aeson.Encode (toEncodingViaCodec, toJSONViaCodec)
import Autodocodec.Class (HasCodec)
import qualified Data.Aeson as JSON
newtype Autodocodec a = Autodocodec {forall a. Autodocodec a -> a
unAutodocodec :: a}
instance (HasCodec a) => JSON.ToJSON (Autodocodec a) where
toJSON :: Autodocodec a -> Value
toJSON = a -> Value
forall a. HasCodec a => a -> Value
toJSONViaCodec (a -> Value) -> (Autodocodec a -> a) -> Autodocodec a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Autodocodec a -> a
forall a. Autodocodec a -> a
unAutodocodec
toEncoding :: Autodocodec a -> Encoding
toEncoding = a -> Encoding
forall a. HasCodec a => a -> Encoding
toEncodingViaCodec (a -> Encoding)
-> (Autodocodec a -> a) -> Autodocodec a -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Autodocodec a -> a
forall a. Autodocodec a -> a
unAutodocodec
instance (HasCodec a) => JSON.FromJSON (Autodocodec a) where
parseJSON :: Value -> Parser (Autodocodec a)
parseJSON = (a -> Autodocodec a) -> Parser a -> Parser (Autodocodec a)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Autodocodec a
forall a. a -> Autodocodec a
Autodocodec (Parser a -> Parser (Autodocodec a))
-> (Value -> Parser a) -> Value -> Parser (Autodocodec a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
forall a. HasCodec a => Value -> Parser a
parseJSONViaCodec