packages feed

paragon-0.1.19: src/Language/Java/Paragon/QuasiQuoter/Derive.hs

{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
module Language.Java.Paragon.QuasiQuoter.Derive where

import Language.Haskell.TH
import Language.Haskell.TH.Lift

import Data.Data (Data)

import Control.Monad ((<=<))

deriveLiftAll :: [Name] -> Q [Dec]
deriveLiftAll ns = do
  is <- mapM (addDataCx <=< reify) ns
  deriveLiftMany' is

addDataCx :: Info -> Q Info
addDataCx i = 
    case i of
      TyConI (DataD dcx n vsk cons _) -> do
          dp <- dataPred $ head vsk
          return $ TyConI (DataD (dp:dcx) n vsk cons [])
      TyConI (NewtypeD dcx n vsk con _) -> do
          dp <- dataPred $ head vsk
          return $ TyConI (NewtypeD (dp:dcx) n vsk con [])
      _ -> error $ "Unhandled Dec: " ++ show i
  where dataPred (PlainTV  n)   = classP ''Data [varT n]
        dataPred (KindedTV n _) = classP ''Data [varT n]