@@ -94,14 +94,13 @@ isReassigned var1 = everything (||) (mkQ False check)
95 check :: JS -> Bool
95 check :: JS -> Bool
96 check (JSFunction _ args _) | var1 `elem` args = True
96 check (JSFunction _ args _) | var1 `elem` args = True
97+ check (JSVariableIntroduction arg _) | var1 == arg = True
97 check _ = False
98 check _ = False
99isRebound :: (Data d) => JS -> d -> Bool
100isRebound :: (Data d) => JS -> d -> Bool
100−isRebound js d = any (\var -> isReassigned var d) (variablesOf js)
101+isRebound js d = any (\var -> isReassigned var d) (everything (++) (mkQ [] variablesOf) js)
102 variablesOf (JSVar var) = [var]
103 variablesOf (JSVar var) = [var]
103− variablesOf (JSAccessor _ val) = variablesOf val
104− variablesOf (JSIndexer index val) = variablesOf index ++ variablesOf val
105 variablesOf _ = []
104 variablesOf _ = []
107isUsed :: (Data d) => String -> d -> Bool
106isUsed :: (Data d) => String -> d -> Bool
@@ -163,7 +162,10 @@ etaConvert = everywhere (mkT convert)
164 convert :: JS -> JS
163 convert :: JS -> JS
165 convert (JSBlock [JSReturn (JSApp (JSFunction Nothing idents block@(JSBlock body)) args)])
164 convert (JSBlock [JSReturn (JSApp (JSFunction Nothing idents block@(JSBlock body)) args)])
165+ | all shouldInline args &&
166+ not (any (flip isRebound block) (map JSVar idents)) &&
167+ not (or (map (flip isRebound block) args))
166− | all shouldInline args && not (or (map (flip isRebound block) args)) = JSBlock (replaceIdents (zip idents args) body)
168+ = JSBlock (replaceIdents (zip idents args) body)
167 convert js = js
169 convert js = js
169unThunk :: JS -> JS
171unThunk :: JS -> JS
@@ -270,12 +272,10 @@ magicDo' = everywhere (mkT undo) . everywhere' (mkT convert)
270 isBind _ = False
272 isBind _ = False
271 isReturn (JSApp retPoly [effDict]) | isRetPoly retPoly && isEffDict effDict = True
273 isReturn (JSApp retPoly [effDict]) | isRetPoly retPoly && isEffDict effDict = True
272 isReturn _ = False
274 isReturn _ = False
273− isBindPoly (JSVar op) | op == identToJs (Op ">>=") = True
274 isBindPoly (JSAccessor prop (JSVar "Prelude")) | prop == identToJs (Op ">>=") = True
275 isBindPoly (JSAccessor prop (JSVar "Prelude")) | prop == identToJs (Op ">>=") = True
275 isBindPoly (JSIndexer (JSStringLiteral ">>=") (JSVar "Prelude")) = True
276 isBindPoly (JSIndexer (JSStringLiteral ">>=") (JSVar "Prelude")) = True
276 isBindPoly _ = False
277 isBindPoly _ = False
277− isRetPoly (JSVar "ret") = True
278− isRetPoly (JSAccessor "ret" (JSVar "Prelude")) = True
278+ isRetPoly (JSAccessor "$return" (JSVar "Prelude")) = True
279 isRetPoly _ = False
279 isRetPoly _ = False
280 prelude = ModuleName (ProperName "Prelude")
280 prelude = ModuleName (ProperName "Prelude")
281 effModule = ModuleName (ProperName "Eff")
281 effModule = ModuleName (ProperName "Eff")