# 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) 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 ```