@@ -215,50 +215,51 @@ expression (A region expr) =
215215
216216
217217definition :: Canonical.Def -> State Int [Statement ()]
218−definition (Canonical.Definition pattern expr@(A region _) _) = do
219− expr' <- expression expr
220− let assign x = varDecl x expr'
221− case pattern of
222− P.Var x
223− | Help.isOp x ->
224− let op = LBracket () (ref "_op") (string x) in
225− return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
226− | otherwise ->
227− return [ VarDeclStmt () [ assign (Var.varName x) ] ]
228−
229− P.Record fields ->
230− let setField f = varDecl f (obj ["$",f]) in
231− return [ VarDeclStmt () (assign "$" : map setField fields) ]
232−
233− P.Data (Var.Canonical _ name) patterns | vars /= Nothing ->
234− return [ VarDeclStmt () (setup (zipWith decl (maybe [] id vars) [0..])) ]
235− where
236− vars = getVars patterns
237− getVars patterns =
238− case patterns of
239− P.Var x : rest -> (Var.varName x :) `fmap` getVars rest
240− [] -> Just []
241− _ -> Nothing
242−
243− decl x n = varDecl x (obj ["$","_" ++ show n])
244− setup vars
245− | Help.isTuple name = assign "$" : vars
246− | otherwise = assign "_raw" : safeAssign : vars
247−
248− safeAssign = varDecl "$" (CondExpr () if' (ref "_raw") exception)
249− if' = InfixExpr () OpStrictEq (obj ["_raw","ctor"]) (string name)
250− exception = Help.throw "badCase" region
251−
252− _ ->
253− do defs' <- concat <$> mapM toDef vars
254− return (VarDeclStmt () [assign "_"] : defs')
255− where
256− vars = P.boundVarList pattern
257− mkVar = A region . localVar
258− toDef y =
259− let expr = A region $ Case (mkVar "_") [(pattern, mkVar y)]
260− in
261− definition $ Canonical.Definition (P.Var y) expr Nothing
218+definition (Canonical.Definition pattern expr@(A region _) _) =
219+ do expr' <- expression expr
220+ let assign x = varDecl x expr'
221+ case pattern of
222+ P.Var x
223+ | Help.isOp x ->
224+ let op = LBracket () (ref "_op") (string x) in
225+ return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
226+
227+ | otherwise ->
228+ return [ VarDeclStmt () [ assign (Var.varName x) ] ]
229+
230+ P.Record fields ->
231+ let setField f = varDecl f (obj ["$",f]) in
232+ return [ VarDeclStmt () (assign "$" : map setField fields) ]
233+
234+ P.Data (Var.Canonical _ name) patterns | vars /= Nothing ->
235+ return [ VarDeclStmt () (setup (zipWith decl (maybe [] id vars) [0..])) ]
236+ where
237+ vars = getVars patterns
238+ getVars patterns =
239+ case patterns of
240+ P.Var x : rest -> (Var.varName x :) `fmap` getVars rest
241+ [] -> Just []
242+ _ -> Nothing
243+
244+ decl x n = varDecl x (obj ["$","_" ++ show n])
245+ setup vars
246+ | Help.isTuple name = assign "$" : vars
247+ | otherwise = assign "_raw" : safeAssign : vars
248+
249+ safeAssign = varDecl "$" (CondExpr () if' (ref "_raw") exception)
250+ if' = InfixExpr () OpStrictEq (obj ["_raw","ctor"]) (string name)
251+ exception = Help.throw "badCase" region
252+
253+ _ ->
254+ do defs' <- concat <$> mapM toDef vars
255+ return (VarDeclStmt () [assign "_"] : defs')
256+ where
257+ vars = P.boundVarList pattern
258+ mkVar = A region . localVar
259+ toDef y =
260+ let expr = A region $ Case (mkVar "_") [(pattern, mkVar y)]
261+ in
262+ definition $ Canonical.Definition (P.Var y) expr Nothing
262263
263264
264265match :: Region -> Case.Match -> State Int [Statement ()]