{-# LANGUAGE TemplateHaskell, CPP #-}
module Control.Distributed.Process.Internal.Closure.TH
(
remotable
, remotableDecl
, mkStatic
, functionSDict
, functionTDict
, mkClosure
, mkStaticClosure
) where
import Prelude hiding (succ, any)
import Language.Haskell.TH
(
Q
, reify
, Loc(loc_module)
, location
, Name
, mkName
, nameBase
, Dec(SigD)
, Exp
, Type(AppT, ForallT, VarT, ArrowT)
, Info(VarI)
#if MIN_VERSION_template_haskell(2,17,0)
, Specificity
#endif
, TyVarBndr(PlainTV, KindedTV)
, Pred
#if MIN_VERSION_template_haskell(2,10,0)
, conT
, appT
#else
, classP
#endif
, varT
, stringL
, normalB
, clause
, varE
, litE
, funD
, sigD
)
import Data.Maybe (catMaybes)
import Data.Binary (encode)
import Data.Generics (everywhereM, mkM, gmapM)
import Data.Rank1Dynamic (toDynamic)
import Data.Rank1Typeable
( Zero
, Succ
, TypVar
)
import Control.Distributed.Static
( RemoteTable
, registerStatic
, Static
, staticLabel
, closure
, staticCompose
, staticClosure
)
import Control.Distributed.Process.Internal.Types (Process)
import Control.Distributed.Process.Serializable
( SerializableDict(SerializableDict)
)
import Control.Distributed.Process.Internal.Closure.BuiltIn (staticDecode)
remotable :: [Name] -> Q [Dec]
remotable :: [Name] -> Q [Dec]
remotable [Name]
ns = do
[(Name, Type)]
types <- (Name -> Q (Name, Type)) -> [Name] -> Q [(Name, Type)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Name -> Q (Name, Type)
getType [Name]
ns
([[Dec]]
closures, [[Q Exp]]
inserts) <- [([Dec], [Q Exp])] -> ([[Dec]], [[Q Exp]])
forall a b. [(a, b)] -> ([a], [b])
unzip ([([Dec], [Q Exp])] -> ([[Dec]], [[Q Exp]]))
-> Q [([Dec], [Q Exp])] -> Q ([[Dec]], [[Q Exp]])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Name, Type) -> Q ([Dec], [Q Exp]))
-> [(Name, Type)] -> Q [([Dec], [Q Exp])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Name, Type) -> Q ([Dec], [Q Exp])
generateDefs [(Name, Type)]
types
[Dec]
rtable <- Name -> [Q Exp] -> Q [Dec]
createMetaData (String -> Name
mkName String
"__remoteTable") ([[Q Exp]] -> [Q Exp]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Q Exp]]
inserts)
[Dec] -> Q [Dec]
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Dec] -> Q [Dec]) -> [Dec] -> Q [Dec]
forall a b. (a -> b) -> a -> b
$ [[Dec]] -> [Dec]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Dec]]
closures [Dec] -> [Dec] -> [Dec]
forall a. [a] -> [a] -> [a]
++ [Dec]
rtable
remotableDecl :: [Q [Dec]] -> Q [Dec]
remotableDecl :: [Q [Dec]] -> Q [Dec]
remotableDecl [Q [Dec]]
qDecs = do
[Dec]
decs <- [[Dec]] -> [Dec]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[Dec]] -> [Dec]) -> Q [[Dec]] -> Q [Dec]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Q [Dec]] -> Q [[Dec]]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Q [Dec]]
qDecs
let types :: [(Name, Type)]
types = [Maybe (Name, Type)] -> [(Name, Type)]
forall a. [Maybe a] -> [a]
catMaybes ((Dec -> Maybe (Name, Type)) -> [Dec] -> [Maybe (Name, Type)]
forall a b. (a -> b) -> [a] -> [b]
map Dec -> Maybe (Name, Type)
typeOf [Dec]
decs)
([[Dec]]
closures, [[Q Exp]]
inserts) <- [([Dec], [Q Exp])] -> ([[Dec]], [[Q Exp]])
forall a b. [(a, b)] -> ([a], [b])
unzip ([([Dec], [Q Exp])] -> ([[Dec]], [[Q Exp]]))
-> Q [([Dec], [Q Exp])] -> Q ([[Dec]], [[Q Exp]])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Name, Type) -> Q ([Dec], [Q Exp]))
-> [(Name, Type)] -> Q [([Dec], [Q Exp])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Name, Type) -> Q ([Dec], [Q Exp])
generateDefs [(Name, Type)]
types
[Dec]
rtable <- Name -> [Q Exp] -> Q [Dec]
createMetaData (String -> Name
mkName String
"__remoteTableDecl") ([[Q Exp]] -> [Q Exp]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Q Exp]]
inserts)
[Dec] -> Q [Dec]
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Dec] -> Q [Dec]) -> [Dec] -> Q [Dec]
forall a b. (a -> b) -> a -> b
$ [Dec]
decs [Dec] -> [Dec] -> [Dec]
forall a. [a] -> [a] -> [a]
++ [[Dec]] -> [Dec]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Dec]]
closures [Dec] -> [Dec] -> [Dec]
forall a. [a] -> [a] -> [a]
++ [Dec]
rtable
where
typeOf :: Dec -> Maybe (Name, Type)
typeOf :: Dec -> Maybe (Name, Type)
typeOf (SigD Name
name Type
typ) = (Name, Type) -> Maybe (Name, Type)
forall a. a -> Maybe a
Just (Name
name, Type
typ)
typeOf Dec
_ = Maybe (Name, Type)
forall a. Maybe a
Nothing
mkStatic :: Name -> Q Exp
mkStatic :: Name -> Q Exp
mkStatic = Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Name -> Q Exp) -> (Name -> Name) -> Name -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Name
staticName
functionSDict :: Name -> Q Exp
functionSDict :: Name -> Q Exp
functionSDict = Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Name -> Q Exp) -> (Name -> Name) -> Name -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Name
sdictName
functionTDict :: Name -> Q Exp
functionTDict :: Name -> Q Exp
functionTDict = Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Name -> Q Exp) -> (Name -> Name) -> Name -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Name
tdictName
mkClosure :: Name -> Q Exp
mkClosure :: Name -> Q Exp
mkClosure Name
n =
[| closure ($(Name -> Q Exp
mkStatic Name
n) `staticCompose` staticDecode $(Name -> Q Exp
functionSDict Name
n))
. encode
|]
mkStaticClosure :: Name -> Q Exp
mkStaticClosure :: Name -> Q Exp
mkStaticClosure Name
n = [| staticClosure $( Name -> Q Exp
mkStatic Name
n ) |]
createMetaData :: Name -> [Q Exp] -> Q [Dec]
createMetaData :: Name -> [Q Exp] -> Q [Dec]
createMetaData Name
name [Q Exp]
is =
[Q Dec] -> Q [Dec]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [ Name -> Q Type -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Type -> m Dec
sigD Name
name [t| RemoteTable -> RemoteTable |]
, Name -> Q Exp -> Q Dec
sfnD Name
name ([Q Exp] -> Q Exp
compose [Q Exp]
is)
]
generateDefs :: (Name, Type) -> Q ([Dec], [Q Exp])
generateDefs :: (Name, Type) -> Q ([Dec], [Q Exp])
generateDefs (Name
origName, Type
fullType) = do
Type
proc <- [t| Process |]
let ([TyVarBndr Specificity]
typVars, Type
typ') = case Type
fullType of ForallT [TyVarBndr Specificity]
vars [] Type
mono -> ([TyVarBndr Specificity]
vars, Type
mono)
Type
_ -> ([], Type
fullType)
([Dec]
static, [Q Exp]
register) <- [TyVarBndr Specificity] -> Type -> Q ([Dec], [Q Exp])
makeStatic [TyVarBndr Specificity]
typVars Type
typ'
([Dec]
sdict, [Q Exp]
registerSDict) <- case ([TyVarBndr Specificity]
typVars, Type
typ') of
([], Type
ArrowT `AppT` Type
arg `AppT` Type
_res) ->
Name -> Type -> Q ([Dec], [Q Exp])
makeDict (Name -> Name
sdictName Name
origName) Type
arg
([TyVarBndr Specificity], Type)
_ ->
([Dec], [Q Exp]) -> Q ([Dec], [Q Exp])
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [])
([Dec]
tdict, [Q Exp]
registerTDict) <- case ([TyVarBndr Specificity]
typVars, Type
typ') of
([], Type
ArrowT `AppT` Type
_arg `AppT` (Type
proc' `AppT` Type
res)) | Type
proc' Type -> Type -> Bool
forall a. Eq a => a -> a -> Bool
== Type
proc ->
Name -> Type -> Q ([Dec], [Q Exp])
makeDict (Name -> Name
tdictName Name
origName) Type
res
([TyVarBndr Specificity], Type)
_ ->
([Dec], [Q Exp]) -> Q ([Dec], [Q Exp])
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [])
([Dec], [Q Exp]) -> Q ([Dec], [Q Exp])
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ( [[Dec]] -> [Dec]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Dec]
static, [Dec]
sdict, [Dec]
tdict]
, [[Q Exp]] -> [Q Exp]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Q Exp]
register, [Q Exp]
registerSDict, [Q Exp]
registerTDict]
)
where
#if MIN_VERSION_template_haskell(2,17,0)
makeStatic :: [TyVarBndr Specificity] -> Type -> Q ([Dec], [Q Exp])
#else
makeStatic :: [TyVarBndr] -> Type -> Q ([Dec], [Q Exp])
#endif
makeStatic :: [TyVarBndr Specificity] -> Type -> Q ([Dec], [Q Exp])
makeStatic [TyVarBndr Specificity]
typVars Type
typ = do
[Dec]
static <- Name -> [TyVarBndr Specificity] -> Type -> Q [Dec]
generateStatic Name
origName [TyVarBndr Specificity]
typVars Type
typ
let dyn :: Q Exp
dyn = case [TyVarBndr Specificity]
typVars of
[] -> [| toDynamic $(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
origName) |]
[TyVarBndr Specificity]
_ -> [| toDynamic ($(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
origName) :: $([TyVarBndr Specificity] -> Type -> Q Type
monomorphize [TyVarBndr Specificity]
typVars Type
typ)) |]
([Dec], [Q Exp]) -> Q ([Dec], [Q Exp])
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ( [Dec]
static
, [ [| registerStatic $(Name -> Q Exp
showFQN Name
origName) $Q Exp
dyn |] ]
)
makeDict :: Name -> Type -> Q ([Dec], [Q Exp])
makeDict :: Name -> Type -> Q ([Dec], [Q Exp])
makeDict Name
dictName Type
typ = do
[Dec]
sdict <- Name -> Type -> Q [Dec]
generateDict Name
dictName Type
typ
let dyn :: Q Exp
dyn = [| toDynamic (SerializableDict :: SerializableDict $(Type -> Q Type
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
typ)) |]
([Dec], [Q Exp]) -> Q ([Dec], [Q Exp])
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ( [Dec]
sdict
, [ [| registerStatic $(Name -> Q Exp
showFQN Name
dictName) $Q Exp
dyn |] ]
)
#if MIN_VERSION_template_haskell(2,17,0)
monomorphize :: [TyVarBndr Specificity] -> Type -> Q Type
#else
monomorphize :: [TyVarBndr] -> Type -> Q Type
#endif
monomorphize :: [TyVarBndr Specificity] -> Type -> Q Type
monomorphize [TyVarBndr Specificity]
tvs =
let subst :: [(Name, Q Type)]
subst = [Name] -> [Q Type] -> [(Name, Q Type)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((TyVarBndr Specificity -> Name)
-> [TyVarBndr Specificity] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TyVarBndr Specificity -> Name
tyVarBndrName [TyVarBndr Specificity]
tvs) [Q Type]
anys
in GenericM Q -> GenericM Q
forall (m :: * -> *). Monad m => GenericM m -> GenericM m
everywhereM ((Type -> Q Type) -> a -> Q a
forall (m :: * -> *) a b.
(Monad m, Typeable a, Typeable b) =>
(b -> m b) -> a -> m a
mkM ([(Name, Q Type)] -> Type -> Q Type
applySubst [(Name, Q Type)]
subst))
where
anys :: [Q Type]
anys :: [Q Type]
anys = (Q Type -> Q Type) -> [Q Type] -> [Q Type]
forall a b. (a -> b) -> [a] -> [b]
map Q Type -> Q Type
typVar ((Q Type -> Q Type) -> Q Type -> [Q Type]
forall a. (a -> a) -> a -> [a]
iterate Q Type -> Q Type
succ Q Type
zero)
typVar :: Q Type -> Q Type
typVar :: Q Type -> Q Type
typVar Q Type
t = [t| TypVar $Q Type
t |]
zero :: Q Type
zero :: Q Type
zero = [t| Zero |]
succ :: Q Type -> Q Type
succ :: Q Type -> Q Type
succ Q Type
t = [t| Succ $Q Type
t |]
applySubst :: [(Name, Q Type)] -> Type -> Q Type
applySubst :: [(Name, Q Type)] -> Type -> Q Type
applySubst [(Name, Q Type)]
s (VarT Name
n) =
case Name -> [(Name, Q Type)] -> Maybe (Q Type)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Name
n [(Name, Q Type)]
s of
Maybe (Q Type)
Nothing -> Type -> Q Type
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return (Name -> Type
VarT Name
n)
Just Q Type
t -> Q Type
t
applySubst [(Name, Q Type)]
s Type
t = GenericM Q -> Type -> Q Type
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> a -> m a
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Type -> m Type
gmapM ((Type -> Q Type) -> d -> Q d
forall (m :: * -> *) a b.
(Monad m, Typeable a, Typeable b) =>
(b -> m b) -> a -> m a
mkM ([(Name, Q Type)] -> Type -> Q Type
applySubst [(Name, Q Type)]
s)) Type
t
#if MIN_VERSION_template_haskell(2,17,0)
generateStatic :: Name -> [TyVarBndr Specificity] -> Type -> Q [Dec]
#else
generateStatic :: Name -> [TyVarBndr] -> Type -> Q [Dec]
#endif
generateStatic :: Name -> [TyVarBndr Specificity] -> Type -> Q [Dec]
generateStatic Name
n [TyVarBndr Specificity]
xs Type
typ = do
Type
staticTyp <- [t| Static |]
[Q Dec] -> Q [Dec]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence
[ Name -> Q Type -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Type -> m Dec
sigD (Name -> Name
staticName Name
n) (Q Type -> Q Dec) -> Q Type -> Q Dec
forall a b. (a -> b) -> a -> b
$ do
[Type]
txs <- [Q Type] -> Q [Type]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence ([Q Type] -> Q [Type]) -> [Q Type] -> Q [Type]
forall a b. (a -> b) -> a -> b
$ (TyVarBndr Specificity -> Q Type)
-> [TyVarBndr Specificity] -> [Q Type]
forall a b. (a -> b) -> [a] -> [b]
map TyVarBndr Specificity -> Q Type
typeable [TyVarBndr Specificity]
xs
Type -> Q Type
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyVarBndr Specificity] -> [Type] -> Type -> Type
ForallT [TyVarBndr Specificity]
xs
[Type]
txs
(Type
staticTyp Type -> Type -> Type
`AppT` Type
typ))
, Name -> Q Exp -> Q Dec
sfnD (Name -> Name
staticName Name
n) [| staticLabel $(Name -> Q Exp
showFQN Name
n) |]
]
where
#if MIN_VERSION_template_haskell(2,17,0)
typeable :: TyVarBndr Specificity -> Q Pred
#else
typeable :: TyVarBndr -> Q Pred
#endif
typeable :: TyVarBndr Specificity -> Q Type
typeable TyVarBndr Specificity
tv =
#if MIN_VERSION_template_haskell(2,10,0)
Name -> Q Type
forall (m :: * -> *). Quote m => Name -> m Type
conT (String -> Name
mkName String
"Typeable") Q Type -> Q Type -> Q Type
forall (m :: * -> *). Quote m => m Type -> m Type -> m Type
`appT` Name -> Q Type
forall (m :: * -> *). Quote m => Name -> m Type
varT (TyVarBndr Specificity -> Name
tyVarBndrName TyVarBndr Specificity
tv)
#else
classP (mkName "Typeable") [varT (tyVarBndrName tv)]
#endif
generateDict :: Name -> Type -> Q [Dec]
generateDict :: Name -> Type -> Q [Dec]
generateDict Name
n Type
typ = do
[Q Dec] -> Q [Dec]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence
[ Name -> Q Type -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Type -> m Dec
sigD Name
n (Q Type -> Q Dec) -> Q Type -> Q Dec
forall a b. (a -> b) -> a -> b
$ [t| Static (SerializableDict $(Type -> Q Type
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
typ)) |]
, Name -> Q Exp -> Q Dec
sfnD Name
n [| staticLabel $(Name -> Q Exp
showFQN Name
n) |]
]
staticName :: Name -> Name
staticName :: Name -> Name
staticName Name
n = String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ Name -> String
nameBase Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"__static"
sdictName :: Name -> Name
sdictName :: Name -> Name
sdictName Name
n = String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ Name -> String
nameBase Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"__sdict"
tdictName :: Name -> Name
tdictName :: Name -> Name
tdictName Name
n = String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ Name -> String
nameBase Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"__tdict"
compose :: [Q Exp] -> Q Exp
compose :: [Q Exp] -> Q Exp
compose [] = [| id |]
compose [Q Exp
e] = Q Exp
e
compose (Q Exp
e:[Q Exp]
es) = [| $Q Exp
e . $([Q Exp] -> Q Exp
compose [Q Exp]
es) |]
stringE :: String -> Q Exp
stringE :: String -> Q Exp
stringE = Lit -> Q Exp
forall (m :: * -> *). Quote m => Lit -> m Exp
litE (Lit -> Q Exp) -> (String -> Lit) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Lit
stringL
getType :: Name -> Q (Name, Type)
getType :: Name -> Q (Name, Type)
getType Name
name = do
Info
info <- Name -> Q Info
reify Name
name
case Info
info of
#if MIN_VERSION_template_haskell(2,11,0)
VarI Name
origName Type
typ Maybe Dec
_ -> (Name, Type) -> Q (Name, Type)
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return (Name
origName, Type
typ)
#else
VarI origName typ _ _ -> return (origName, typ)
#endif
Info
_ -> String -> Q (Name, Type)
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Q (Name, Type)) -> String -> Q (Name, Type)
forall a b. (a -> b) -> a -> b
$ Name -> String
forall a. Show a => a -> String
show Name
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not found"
sfnD :: Name -> Q Exp -> Q Dec
sfnD :: Name -> Q Exp -> Q Dec
sfnD Name
n Q Exp
e = Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD Name
n [[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause [] (Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB Q Exp
e) []]
#if MIN_VERSION_template_haskell(2,17,0)
tyVarBndrName :: TyVarBndr Specificity -> Name
tyVarBndrName :: TyVarBndr Specificity -> Name
tyVarBndrName (PlainTV Name
n Specificity
_) = Name
n
tyVarBndrName (KindedTV Name
n Specificity
_ Type
_) = Name
n
#else
tyVarBndrName :: TyVarBndr -> Name
tyVarBndrName (PlainTV n) = n
tyVarBndrName (KindedTV n _) = n
#endif
showFQN :: Name -> Q Exp
showFQN :: Name -> Q Exp
showFQN Name
n = do
Loc
loc <- Q Loc
location
String -> Q Exp
stringE (Loc -> String
loc_module Loc
loc String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"." String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
nameBase Name
n)