- -> TcType -- elt_ty, where type of the comprehension is (m elt_ty)
- -> TcM s ([TcStmt], LIE)
-
-tcStmts do_or_lc m (stmt@(ReturnStmt exp) : stmts) elt_ty
- = ASSERT( null stmts )
- tcSetErrCtxt (stmtCtxt do_or_lc stmt) $
- tcExpr exp elt_ty `thenTc` \ (exp', exp_lie) ->
- returnTc ([ReturnStmt exp'], exp_lie)
-
- -- ExprStmt at the end
-tcStmts do_or_lc m [stmt@(ExprStmt exp src_loc)] elt_ty
- = tcSetErrCtxt (stmtCtxt do_or_lc stmt) $
- tcExpr exp (m elt_ty) `thenTc` \ (exp', exp_lie) ->
- returnTc ([ExprStmt exp' src_loc], exp_lie)
-
- -- ExprStmt not at the end
-tcStmts do_or_lc m (stmt@(ExprStmt exp src_loc) : stmts) elt_ty
- = ASSERT( isDoStmt do_or_lc )
- tcAddSrcLoc src_loc (
- tcSetErrCtxt (stmtCtxt do_or_lc stmt) $
- -- exp has type (m tau) for some tau (doesn't matter what)
- newTyVarTy_OpenKind `thenNF_Tc` \ any_ty ->
- tcExpr exp (m any_ty)
- ) `thenTc` \ (exp', exp_lie) ->
- tcStmts do_or_lc m stmts elt_ty `thenTc` \ (stmts', stmts_lie) ->
- returnTc (ExprStmt exp' src_loc : stmts',
- exp_lie `plusLIE` stmts_lie)
-
-tcStmts do_or_lc m (stmt@(GuardStmt exp src_loc) : stmts) elt_ty
- = ASSERT( not (isDoStmt do_or_lc) )
- tcSetErrCtxt (stmtCtxt do_or_lc stmt) (
- tcAddSrcLoc src_loc $
- tcExpr exp boolTy
- ) `thenTc` \ (exp', exp_lie) ->
- tcStmts do_or_lc m stmts elt_ty `thenTc` \ (stmts', stmts_lie) ->
- returnTc (GuardStmt exp' src_loc : stmts',
- exp_lie `plusLIE` stmts_lie)
-
-tcStmts do_or_lc m (stmt@(BindStmt pat exp src_loc) : stmts) elt_ty
+ -> TcM (thing, LIE)
+ -> TcM (thing, LIE)
+
+ -- Base case
+tcStmtsAndThen combine do_or_lc m_ty [] do_next
+ = do_next
+
+ -- LetStmt
+tcStmtsAndThen combine do_or_lc m_ty (LetStmt binds : stmts) do_next
+ = tcBindsAndThen -- No error context, but a binding group is
+ (glue_binds combine) -- rather a large thing for an error context anyway
+ binds
+ (tcStmtsAndThen combine do_or_lc m_ty stmts do_next)
+
+ -- BindStmt
+tcStmtsAndThen combine do_or_lc m_ty@(m,elt_ty) (stmt@(BindStmt pat exp src_loc) : stmts) do_next