Safe Haskell | None |
---|
- externals :: [External]
- caseFloatApp :: RewriteH CoreExpr
- caseFloatArg :: RewriteH CoreExpr
- caseFloatCase :: RewriteH CoreExpr
- caseFloatCast :: RewriteH CoreExpr
- caseFloatLet :: RewriteH CoreExpr
- caseFloat :: RewriteH CoreExpr
- caseUnfloat :: RewriteH CoreExpr
- caseUnfloatApp :: RewriteH CoreExpr
- caseUnfloatArgs :: RewriteH CoreExpr
- caseReduce :: RewriteH CoreExpr
- caseReduceDatacon :: RewriteH CoreExpr
- caseReduceLiteral :: RewriteH CoreExpr
- caseSplit :: Name -> RewriteH CoreExpr
- caseSplitInline :: Name -> RewriteH Core
Rewrites on Case Expressions
caseFloatApp :: RewriteH CoreExprSource
(case s of alt1 -> e1; alt2 -> e2) v ==> case s of alt1 -> e1 v; alt2 -> e2 v
caseFloatArg :: RewriteH CoreExprSource
f (case s of alt1 -> e1; alt2 -> e2)
==> case s of alt1 -> f e1; alt2 -> f e2
Only safe if f
is strict.
caseFloatCase :: RewriteH CoreExprSource
case (case s1 of alt11 -> e11; alt12 -> e12) of alt21 -> e21; alt22 -> e22 ==> case s1 of alt11 -> case e11 of alt21 -> e21; alt22 -> e22 alt12 -> case e12 of alt21 -> e21; alt22 -> e22
caseFloatCast :: RewriteH CoreExprSource
cast (case s of p -> e) co ==> case s of p -> cast e co
caseFloatLet :: RewriteH CoreExprSource
let v = case s of alt1 -> e1 in e ==> case s of alt1 -> let v = e1 in e
caseReduceDatacon :: RewriteH CoreExprSource
Case-of-known-constructor rewrite.
caseSplit :: Name -> RewriteH CoreExprSource
Case split a free variable in an expression:
Assume expression e which mentions x :: [a]
e ==> case x of x [] -> e (a:b) -> e
caseSplitInline :: Name -> RewriteH CoreSource
Like caseSplit, but additionally inlines the constructor applications for each occurance of the named variable.
caseSplitInline nm = caseSplit nm >>> anybuR (inlineName nm)