{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleInstances #-}
import Language.Haskell.TH (runIO)
import Data.Functor.ProductIsomorphic.TH
(reifyRecordType, defineProductConstructor)
newtype NNormal = NNormal Int
newtype NRec = NRec { _nrec :: Int }
data DNormal = DNormal Int
data DRec = DRec { _drec :: Int }
-- expect compilation error on test failure
$(mapM_ (\(tn, dn) -> do
runIO . putStrLn $ "testing " ++ show (tn, dn)
--- (((TypeQ, [Name]), ExpQ), (Maybe [Name], [TypeQ]))
(((tq, vns), eq), (fns, ftqs)) <- reifyRecordType tn
ty <- tq
expr <- eq
fts <- sequence ftqs
runIO $ print (((ty, vns), expr), (fns, fts))
)
[(''NNormal, 'NNormal), (''NRec, 'NRec),
(''DNormal, 'DNormal), (''DRec, 'DRec)]
>> return [])
$(defineProductConstructor ''NNormal)
$(defineProductConstructor ''NRec)
$(defineProductConstructor ''DNormal)
$(defineProductConstructor ''DRec)
main :: IO ()
main = return ()