module Data.Enum.Deriving.Internal (
deriveEnum
, makeSucc
, makePred
, makeToEnum
, makeFromEnum
, makeEnumFrom
, makeEnumFromThen
) where
import Data.Deriving.Internal
import Data.List.NonEmpty (NonEmpty(..))
import Language.Haskell.TH.Datatype
import Language.Haskell.TH.Lib
import Language.Haskell.TH.Syntax
deriveEnum :: Name -> Q [Dec]
deriveEnum :: Name -> Q [Dec]
deriveEnum Name
name = do
DatatypeInfo
info <- Name -> Q DatatypeInfo
reifyDatatype Name
name
case DatatypeInfo
info of
DatatypeInfo { datatypeContext :: DatatypeInfo -> Cxt
datatypeContext = Cxt
ctxt
, datatypeName :: DatatypeInfo -> Name
datatypeName = Name
parentName
, datatypeInstTypes :: DatatypeInfo -> Cxt
datatypeInstTypes = Cxt
instTypes
, datatypeVariant :: DatatypeInfo -> DatatypeVariant
datatypeVariant = DatatypeVariant
variant
, datatypeCons :: DatatypeInfo -> [ConstructorInfo]
datatypeCons = [ConstructorInfo]
cons
} -> do
(Cxt
instanceCxt, Type
instanceType)
<- EnumClass -> Name -> Cxt -> Cxt -> DatatypeVariant -> Q (Cxt, Type)
forall a.
ClassRep a =>
a -> Name -> Cxt -> Cxt -> DatatypeVariant -> Q (Cxt, Type)
buildTypeInstance EnumClass
EnumClass Name
parentName Cxt
ctxt Cxt
instTypes DatatypeVariant
variant
(Dec -> [Dec] -> [Dec]
forall a. a -> [a] -> [a]
:[]) (Dec -> [Dec]) -> Q Dec -> Q [Dec]
forall a b. (a -> b) -> Q a -> Q b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Q Cxt -> Q Type -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Type -> [m Dec] -> m Dec
instanceD (Cxt -> Q Cxt
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Cxt
instanceCxt)
(Type -> Q Type
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
instanceType)
(Name -> Type -> [ConstructorInfo] -> [Q Dec]
enumFunDecs Name
parentName Type
instanceType [ConstructorInfo]
cons)
makeSucc :: Name -> Q Exp
makeSucc :: Name -> Q Exp
makeSucc = EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
Succ
makePred :: Name -> Q Exp
makePred :: Name -> Q Exp
makePred = EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
Pred
makeToEnum :: Name -> Q Exp
makeToEnum :: Name -> Q Exp
makeToEnum = EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
ToEnum
makeFromEnum :: Name -> Q Exp
= EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
FromEnum
makeEnumFrom :: Name -> Q Exp
makeEnumFrom :: Name -> Q Exp
makeEnumFrom = EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
EnumFrom
makeEnumFromThen :: Name -> Q Exp
makeEnumFromThen :: Name -> Q Exp
makeEnumFromThen = EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
EnumFromThen
enumFunDecs :: Name -> Type -> [ConstructorInfo] -> [Q Dec]
enumFunDecs :: Name -> Type -> [ConstructorInfo] -> [Q Dec]
enumFunDecs Name
tyName Type
ty [ConstructorInfo]
cons =
(EnumFun -> Q Dec) -> [EnumFun] -> [Q Dec]
forall a b. (a -> b) -> [a] -> [b]
map EnumFun -> Q Dec
makeFunD [ EnumFun
Succ
, EnumFun
Pred
, EnumFun
ToEnum
, EnumFun
EnumFrom
, EnumFun
EnumFromThen
, EnumFun
FromEnum
]
where
makeFunD :: EnumFun -> Q Dec
makeFunD :: EnumFun -> Q Dec
makeFunD EnumFun
ef =
Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (EnumFun -> Name
enumFunName EnumFun
ef)
[ [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 -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$ EnumFun -> Name -> Type -> [ConstructorInfo] -> Q Exp
makeEnumFunForCons EnumFun
ef Name
tyName Type
ty [ConstructorInfo]
cons)
[]
]
makeEnumFun :: EnumFun -> Name -> Q Exp
makeEnumFun :: EnumFun -> Name -> Q Exp
makeEnumFun EnumFun
ef Name
name = do
DatatypeInfo
info <- Name -> Q DatatypeInfo
reifyDatatype Name
name
case DatatypeInfo
info of
DatatypeInfo { datatypeContext :: DatatypeInfo -> Cxt
datatypeContext = Cxt
ctxt
, datatypeName :: DatatypeInfo -> Name
datatypeName = Name
parentName
, datatypeInstTypes :: DatatypeInfo -> Cxt
datatypeInstTypes = Cxt
instTypes
, datatypeVariant :: DatatypeInfo -> DatatypeVariant
datatypeVariant = DatatypeVariant
variant
, datatypeCons :: DatatypeInfo -> [ConstructorInfo]
datatypeCons = [ConstructorInfo]
cons
} -> do
(Cxt
_, Type
instanceType) <- EnumClass -> Name -> Cxt -> Cxt -> DatatypeVariant -> Q (Cxt, Type)
forall a.
ClassRep a =>
a -> Name -> Cxt -> Cxt -> DatatypeVariant -> Q (Cxt, Type)
buildTypeInstance EnumClass
EnumClass Name
parentName Cxt
ctxt Cxt
instTypes DatatypeVariant
variant
EnumFun -> Name -> Type -> [ConstructorInfo] -> Q Exp
makeEnumFunForCons EnumFun
ef Name
parentName Type
instanceType [ConstructorInfo]
cons
makeEnumFunForCons :: EnumFun -> Name -> Type -> [ConstructorInfo] -> Q Exp
makeEnumFunForCons :: EnumFun -> Name -> Type -> [ConstructorInfo] -> Q Exp
makeEnumFunForCons EnumFun
_ Name
_ Type
_ [] = Q Exp
forall a. Q a
noConstructorsError
makeEnumFunForCons EnumFun
ef Name
tyName Type
ty (ConstructorInfo
con:[ConstructorInfo]
cons')
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ NonEmpty ConstructorInfo -> Bool
isEnumerationType NonEmpty ConstructorInfo
cons
= String -> Q Exp
forall a. String -> Q a
enumerationError String
tyNameBase
| Bool
otherwise = case EnumFun
ef of
EnumFun
Succ -> (Name -> Q Exp) -> Q Exp
lamOneHash ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
aHash ->
Q Exp -> Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp -> m Exp
condE (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
eqValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
maxTagExpr Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash))
(String -> String -> String -> Q Exp
illegalExpr String
"succ" String
tyNameBase
String
"tried to take `succ' of last tag in enumeration")
(Q Exp
tag2Con Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
plusValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash) Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Int -> Q Exp
integerE Int
1))
EnumFun
Pred -> (Name -> Q Exp) -> Q Exp
lamOneHash ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
aHash ->
Q Exp -> Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp -> m Exp
condE (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
eqValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Int -> Q Exp
integerE Int
0 Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash))
(String -> String -> String -> Q Exp
illegalExpr String
"pred" String
tyNameBase
String
"tried to take `pred' of first tag in enumeration")
(Q Exp
tag2Con Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
plusValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash) Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Int -> Q Exp
integerE (-Int
1)))
EnumFun
ToEnum -> (Name -> Q Exp) -> Q Exp
lamOne ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
a ->
Q Exp -> Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp -> m Exp
condE ([Q Exp] -> Q Exp
forall (m :: * -> *). Quote m => [m Exp] -> m Exp
appsE [ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
andValName
, Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
geValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
a Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Int -> Q Exp
integerE Int
0
, Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
leValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
a Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
maxTagExpr
])
(Q Exp
tag2Con Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
a)
(String -> Q Exp -> Name -> Q Exp
illegalToEnumTag String
tyNameBase Q Exp
maxTagExpr Name
a)
EnumFun
EnumFrom -> (Name -> Q Exp) -> Q Exp
lamOneHash ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
aHash ->
[Q Exp] -> Q Exp
forall (m :: * -> *). Quote m => [m Exp] -> m Exp
appsE [ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
mapValName
, Q Exp
tag2Con
, Q Exp -> Q Exp -> Q Exp
enumFromToExpr (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash) Q Exp
maxTagExpr
]
EnumFun
EnumFromThen -> do
Name
a <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a"
Name
aHash <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a#"
Name
b <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b"
Name
bHash <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b#"
[Q Pat] -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => [m Pat] -> m Exp -> m Exp
lamE [Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
a, Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
b] (Q Exp -> Q Exp) -> Q Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$ [(Name, Name)] -> Q Exp -> Q Exp
untagExpr [(Name
a, Name
aHash), (Name
b, Name
bHash)] (Q Exp -> Q Exp) -> Q Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
mapValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
tag2Con) (Q Exp -> Q Exp) -> Q Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$
Q Exp -> Q Exp -> Q Exp -> Q Exp
enumFromThenToExpr
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash)
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
bHash)
(Q Exp -> Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp -> m Exp
condE ([Q Exp] -> Q Exp
forall (m :: * -> *). Quote m => [m Exp] -> m Exp
appsE [ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
gtValName
, Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash
, Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
bHash
])
(Int -> Q Exp
integerE Int
0) Q Exp
maxTagExpr)
EnumFun
FromEnum -> (Name -> Q Exp) -> Q Exp
lamOneHash ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
aHash ->
Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE Name
iHashDataName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
aHash
where
tyNameBase :: String
tyNameBase :: String
tyNameBase = Name -> String
nameBase Name
tyName
cons :: NonEmpty ConstructorInfo
cons :: NonEmpty ConstructorInfo
cons = ConstructorInfo
con ConstructorInfo -> [ConstructorInfo] -> NonEmpty ConstructorInfo
forall a. a -> [a] -> NonEmpty a
:| [ConstructorInfo]
cons'
maxTagExpr :: Q Exp
maxTagExpr :: Q Exp
maxTagExpr = Int -> Q Exp
integerE ([ConstructorInfo] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ConstructorInfo]
cons') Q Exp -> Q Type -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Type -> m Exp
`sigE` Name -> Q Type
forall (m :: * -> *). Quote m => Name -> m Type
conT Name
intTypeName
lamOne :: (Name -> Q Exp) -> Q Exp
lamOne :: (Name -> Q Exp) -> Q Exp
lamOne Name -> Q Exp
f = do
Name
a <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a"
Q Pat -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Pat -> m Exp -> m Exp
lam1E (Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
a) (Q Exp -> Q Exp) -> Q Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
f Name
a
lamOneHash :: (Name -> Q Exp) -> Q Exp
lamOneHash :: (Name -> Q Exp) -> Q Exp
lamOneHash Name -> Q Exp
f = (Name -> Q Exp) -> Q Exp
lamOne ((Name -> Q Exp) -> Q Exp) -> (Name -> Q Exp) -> Q Exp
forall a b. (a -> b) -> a -> b
$ \Name
a -> do
Name
aHash <- String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a#"
[(Name, Name)] -> Q Exp -> Q Exp
untagExpr [(Name
a, Name
aHash)] (Q Exp -> Q Exp) -> Q Exp -> Q Exp
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
f Name
aHash
tag2Con :: Q Exp
tag2Con :: Q Exp
tag2Con = Type -> Q Exp
tag2ConExpr (Type -> Q Exp) -> Type -> Q Exp
forall a b. (a -> b) -> a -> b
$ Type -> Type
removeClassApp Type
ty
data EnumClass = EnumClass
instance ClassRep EnumClass where
arity :: EnumClass -> Int
arity EnumClass
_ = Int
0
allowExQuant :: EnumClass -> Bool
allowExQuant EnumClass
_ = Bool
True
fullClassName :: EnumClass -> Name
fullClassName EnumClass
_ = Name
enumTypeName
classConstraint :: EnumClass -> Int -> Maybe Name
classConstraint EnumClass
_ Int
0 = Name -> Maybe Name
forall a. a -> Maybe a
Just (Name -> Maybe Name) -> Name -> Maybe Name
forall a b. (a -> b) -> a -> b
$ Name
enumTypeName
classConstraint EnumClass
_ Int
_ = Maybe Name
forall a. Maybe a
Nothing
data EnumFun = Succ
| Pred
| ToEnum
|
| EnumFrom
| EnumFromThen
deriving Int -> EnumFun -> ShowS
[EnumFun] -> ShowS
EnumFun -> String
(Int -> EnumFun -> ShowS)
-> (EnumFun -> String) -> ([EnumFun] -> ShowS) -> Show EnumFun
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnumFun -> ShowS
showsPrec :: Int -> EnumFun -> ShowS
$cshow :: EnumFun -> String
show :: EnumFun -> String
$cshowList :: [EnumFun] -> ShowS
showList :: [EnumFun] -> ShowS
Show
enumFunName :: EnumFun -> Name
enumFunName :: EnumFun -> Name
enumFunName EnumFun
Succ = Name
succValName
enumFunName EnumFun
Pred = Name
predValName
enumFunName EnumFun
ToEnum = Name
toEnumValName
enumFunName EnumFun
FromEnum = Name
fromEnumValName
enumFunName EnumFun
EnumFrom = Name
enumFromValName
enumFunName EnumFun
EnumFromThen = Name
enumFromThenValName
enumFromThenToExpr :: Q Exp -> Q Exp -> Q Exp -> Q Exp
enumFromThenToExpr :: Q Exp -> Q Exp -> Q Exp -> Q Exp
enumFromThenToExpr Q Exp
f Q Exp
t1 Q Exp
t2 = Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
enumFromThenToValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
f Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
t1 Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Q Exp
t2
illegalExpr :: String -> String -> String -> Q Exp
illegalExpr :: String -> String -> String -> Q Exp
illegalExpr String
meth String
tp String
msg =
Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
errorValName Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` String -> Q Exp
forall (m :: * -> *). Quote m => String -> m Exp
stringE (String
meth String -> ShowS
forall a. [a] -> [a] -> [a]
++ Char
'{'Char -> ShowS
forall a. a -> [a] -> [a]
:String
tp String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"}: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
msg)
illegalToEnumTag :: String -> Q Exp -> Name -> Q Exp
illegalToEnumTag :: String -> Q Exp -> Name -> Q Exp
illegalToEnumTag String
tp Q Exp
maxtag Name
a =
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
errorValName)
(Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
appendValName)
(String -> Q Exp
forall (m :: * -> *). Quote m => String -> m Exp
stringE (String
"toEnum{" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
tp String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"}: tag(")))
(Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
showsPrecValName)
(Int -> Q Exp
integerE Int
0))
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
a))
(Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
appendValName)
(String -> Q Exp
forall (m :: * -> *). Quote m => String -> m Exp
stringE String
") is outside of enumeration's range (0,"))
(Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE (Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
appE
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
showsPrecValName)
(Int -> Q Exp
integerE Int
0))
Q Exp
maxtag)
(String -> Q Exp
forall (m :: * -> *). Quote m => String -> m Exp
stringE String
")")))))