aeson-gadt-th 0.2.1.0 → 0.2.1.1
raw patch · 4 files changed
+189/−163 lines, 4 filesdep +dependent-sum-templatePVP ok
version bump matches the API change (PVP)
Dependencies added: dependent-sum-template
API changes (from Hackage documentation)
Files
- ChangeLog.md +4/−0
- README.lhs +91/−80
- README.md +91/−80
- aeson-gadt-th.cabal +3/−3
ChangeLog.md view
@@ -1,5 +1,9 @@ # 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.
README.lhs view
@@ -1,86 +1,97 @@-# aeson-gadt-th+aeson-gadt-th+============= Provides Template Haskell expressions for deriving `ToJSON` and `FromJSON` instances for GADTs. -## Example Usage:+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)-import Data.Dependent.Sum (DSum)-import Data.Functor.Identity-import Data.GADT.Compare--data A :: * -> * where- A_a :: A a- A_b :: Int -> A ()--data B c :: * -> * where- B_a :: c -> A a -> B c a- B_x :: B c a--data C t :: * -> * where- C_t :: t -> C t t--deriveJSONGADT ''A-deriveJSONGADT ''B-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 = return ()-```--## Encoding:-```-encode A_a-> "[\"A_a\",[]]"-```--## Decoding:--When decoding a JSON-encoded GADT, the result will be wrapped using [Data.Some.This](http://hackage.haskell.org/package/dependent-sum-0.4/docs/Data-Some.html).-```-case (decode $ encode A_a) :: Maybe (Some A) of- Nothing -> error "Couldn't decode- Just (This A_a) -> putStrLn "it worked"- Just (This A_b) -> putStrLn "wat"-> it worked+> {-# 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"+> ] ```
README.md view
@@ -1,86 +1,97 @@-# aeson-gadt-th+aeson-gadt-th+============= Provides Template Haskell expressions for deriving `ToJSON` and `FromJSON` instances for GADTs. -## Example Usage:+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)-import Data.Dependent.Sum (DSum)-import Data.Functor.Identity-import Data.GADT.Compare--data A :: * -> * where- A_a :: A a- A_b :: Int -> A ()--data B c :: * -> * where- B_a :: c -> A a -> B c a- B_x :: B c a--data C t :: * -> * where- C_t :: t -> C t t--deriveJSONGADT ''A-deriveJSONGADT ''B-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 = return ()-```--## Encoding:-```-encode A_a-> "[\"A_a\",[]]"-```--## Decoding:--When decoding a JSON-encoded GADT, the result will be wrapped using [Data.Some.This](http://hackage.haskell.org/package/dependent-sum-0.4/docs/Data-Some.html).-```-case (decode $ encode A_a) :: Maybe (Some A) of- Nothing -> error "Couldn't decode- Just (This A_a) -> putStrLn "it worked"- Just (This A_b) -> putStrLn "wat"-> it worked+> {-# 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"+> ] ```
aeson-gadt-th.cabal view
@@ -1,6 +1,6 @@ cabal-version: >=2.0 name: aeson-gadt-th-version: 0.2.1.0+version: 0.2.1.1 synopsis: Derivation of Aeson instances for GADTs category: JSON description: Template Haskell for generating ToJSON and FromJSON instances for GADTs. See <https://github.com/obsidiansystems/aeson-gadt-th/blob/master/README.md README.md> for examples.@@ -28,12 +28,12 @@ build-depends: base , aeson , dependent-sum+ , dependent-sum-template , dependent-map , aeson-gadt-th default-language: Haskell2010 main-is: README.lhs- ghc-options: -pgmL markdown-unlit -Wall- build-tool-depends: markdown-unlit:markdown-unlit+ ghc-options: -Wall -optL -q test-suite aeson-gadt-th-test type: exitcode-stdio-1.0