aeson-gadt-th

Derivation of Aeson instances for GADTs

Latest on Hackage:0.2.1.1

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD-3-Clause licensed by Obsidian Systems LLC
aeson-gadt-th
=============

Provides Template Haskell expressions for deriving `ToJSON` and `FromJSON` instances for GADTs.

Example Usage:
--------------

```haskell
> {-# LANGUAGE GADTs #-}
> {-# LANGUAGE KindSignatures #-}
> {-# LANGUAGE TemplateHaskell #-}
> {-# LANGUAGE FlexibleContexts #-}
> {-# LANGUAGE FlexibleInstances #-}
> {-# LANGUAGE UndecidableInstances #-}
> {-# LANGUAGE MultiParamTypeClasses #-}
>
> import Data.Aeson
> import Data.Aeson.GADT.TH
>
> import Data.Dependent.Map (DMap, Some(..))
> import Data.Dependent.Sum (DSum)
> import Data.Functor.Identity
> import Data.GADT.Compare
> import Data.GADT.Show.TH
>
> data A :: * -> * where
> A_a :: A a
> A_b :: Int -> A ()
>
> deriveJSONGADT ''A
> deriveGShow ''A
>
> data B c :: * -> * where
> B_a :: c -> A a -> B c a
> B_x :: B c a
>
> deriveJSONGADT ''B
>
> data C t :: * -> * where
> C_t :: t -> C t t
>
> deriveJSONGADT ''C
>
> -- Some real-world-ish examples.
>
> -- | Edit operations for `LabelledGraph`
> data LabelledGraphEdit v vm em :: * -> * where
> LabelledGraphEdit_ClearAll :: LabelledGraphEdit v vm em ()
> LabelledGraphEdit_AddVertex :: vm -> LabelledGraphEdit v vm em v
> LabelledGraphEdit_AddEdge :: v -> v -> em -> LabelledGraphEdit v vm em ()
> LabelledGraphEdit_SetVertexProperties :: v -> vm -> LabelledGraphEdit v vm em ()
> LabelledGraphEdit_SetEdgeProperties :: v -> v -> em -> LabelledGraphEdit v vm em ()
>
> -- | PropertyGraphEdit operatios for `PropertyGraph`
> data PropertyGraphEdit v vp ep r where
> PropertyGraphEdit_ClearAll :: PropertyGraphEdit v vp ep ()
> PropertyGraphEdit_AddVertex :: (DMap vp Identity) -> PropertyGraphEdit v vp ep v
> PropertyGraphEdit_AddEdge :: v -> v -> (DMap ep Identity) -> PropertyGraphEdit v vp ep ()
> PropertyGraphEdit_SetVertexProperty :: GCompare vp => v -> DSum vp Identity -> PropertyGraphEdit v vp ep ()
> PropertyGraphEdit_SetEdgeProperty :: GCompare ep => v -> v -> DSum ep Identity -> PropertyGraphEdit v vp ep ()
>
> -- | View operations for `LabelledGraph`
> data LabelledGraphView v vm em :: * -> * where
> LabelledGraphView_All :: LabelledGraphView v vm em ()
> LabelledGraphView_GetVertexProperties :: v -> LabelledGraphView v vm em vm
> LabelledGraphView_GetEdgeProperties :: v -> v -> LabelledGraphView v vm em em
>
> deriveJSONGADT ''LabelledGraphEdit
> deriveJSONGADT ''PropertyGraphEdit
> deriveJSONGADT ''LabelledGraphView
>
> main :: IO ()
> main = do
> putStrLn $ unlines
> [ "Encoding of A_a:"
> , show $ encode A_a
> , "Decoding of encoded A_a:"
> , show (decode $ encode A_a :: Maybe (Some A))
> ]
>
> putStrLn $ unlines
> [ "Encoding of (A_b 1):"
> , show $ encode (A_b 1)
> , "Decoding of encoded (A_b 1):"
> , show (decode $ encode (A_b 1) :: Maybe (Some A))
> ]
>
> putStrLn $ unlines
> [ "Encoding of (B_a 'a' (A_b 1)):"
> , show $ encode (B_a 'a' (A_b 1))
> , "Decoding of encoded (B_a 'a' (A_b 1)):"
> , case (decode $ encode (B_a 'a' (A_b 1)) :: Maybe (Some (B Char))) of
> Just (This (B_a 'a' (A_b 1))) -> "Succeeded"
> _-> "Failed"
> ]
```

Changes

Revision history for aeson-gadt-th

0.2.1.1

  • Drop markdown-unlit in favor of “Bird”-style LHS to avoid some cross-compilation issues.

0.2.1.0

  • Extend type variable substitution to handle all current cases in template-haskell.
  • Better deal with data constructors having an index that is polymorphic, but can be determined from the other type parameters.
  • Handle data constructors that are constrained by type classes.

0.2.0.0

  • Add changelog
  • Add option to modify constructor tag in derived JSON
  • Add test suite
comments powered byDisqus