{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-} module GRose where -- Test case for Issue #1. import Generics.MultiRec.Base import Generics.MultiRec.TH data GRose a = Leaf a | Node [GRose a] data GRoseF :: * -> * -> * where GRose :: GRoseF a (GRose a) $(deriveAll ''GRoseF) -- Desired output: -- -- data Leaf -- data Node -- -- instance Constructor Leaf where -- conName _ = "Leaf" -- instance Constructor Node where -- conName _ = "Node" -- -- type instance PF (GRoseF a) = -- (:>:) ((:+:) (C Leaf (K a)) (C Node ((:.:) [] (I (GRose a))))) (GRose a) -- -- instance El (GRoseF a) (GRose a) where -- proof = GRose -- -- instance Fam (GRoseF a) where -- -- from GRose (Leaf f0) = Tag (L (C (K f0))) -- from GRose (Node f0) = Tag (R (C ((D . (fmap (I . I0))) f0))) -- -- to GRose (Tag (L (C f0))) = Leaf (unK f0) -- to GRose (Tag (R (C f0))) = Node (((fmap (unI0 . unI)) . unD) f0) -- -- instance EqS (GRoseF a) where -- eqS GRose GRose = Just Refl