| AppSecond -- ^ The expression is the second
-- argument of an application
-- (i.e., something is applied to it)
- | LetBinding -- ^ The expression is bound in a
+ | LetBinding [CoreSyn.CoreBndr]
+ -- ^ The expression is bound in a
-- (recursive or non-recursive) let
-- expression.
- | LetBody -- ^ The expression is the body of a
+ | LetBody [CoreSyn.CoreBndr]
+ -- ^ The expression is the body of a
-- let expression
- | LambdaBody -- ^ The expression is the body of a
+ | LambdaBody CoreSyn.CoreBndr
+ -- ^ The expression is the body of a
-- lambda abstraction
+ | CaseAlt CoreSyn.CoreBndr
+ -- ^ The expression is the body of a
+ -- case alternative.
| Other -- ^ Another context
deriving (Eq, Show)
-- | Transforms a CoreExpr and keeps track if it has changed.
type Transform = [CoreContext] -> CoreSyn.CoreExpr -> TransformMonad CoreSyn.CoreExpr
+
+-- Predicates for each of the context types
+is_appfirst_ctx, is_appsecond_ctx, is_letbinding_ctx, is_letbody_ctx, is_lambdabody_ctx
+ :: CoreContext -> Bool
+
+is_appfirst_ctx AppFirst = True
+is_appfirst_ctx _ = False
+
+is_appsecond_ctx AppSecond = True
+is_appsecond_ctx _ = False
+
+is_letbinding_ctx (LetBinding _) = True
+is_letbinding_ctx _ = False
+
+is_letbody_ctx (LetBody _) = True
+is_letbody_ctx _ = False
+
+is_lambdabody_ctx (LambdaBody _) = True
+is_lambdabody_ctx _ = False