module Language.Haskell.TypeTree.CheatingLift
( liftName
) where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Prelude.Compat
$(do TyConI (DataD _ _ _ _ [NormalC x _] _) <- reify ''Name
arg1 <- newName "arg"
arg2 <- newName "arg"
sequence
[ sigD (mkName "liftName") [t|Name -> ExpQ|]
, funD
(mkName "liftName")
[ clause
[conP x [varP arg1, varP arg2]]
(normalB
[|appsE
[ conE $(liftData x)
, $(appE (varE $ mkName "liftOcc") (varE arg1))
, $(appE (varE $ mkName "liftFlv") (varE arg2))
]|])
[]
]
])
liftOcc :: OccName -> ExpQ
liftOcc (OccName s) = [|OccName $(stringE s)|]
liftFlv :: NameFlavour -> ExpQ
liftFlv NameS = [|NameS|]
liftFlv (NameG x (PkgName s) (ModName y)) =
[|NameG $(liftData x) (PkgName $(stringE s)) (ModName $(stringE y))|]
liftFlv (NameQ (ModName x)) = [|NameQ (ModName $(stringE x))|]
liftFlv (NameU i) = [|NameU i|]
liftFlv (NameL i) = [|NameL i|]