@@ -27,6 +27,7 @@ import Language.PureScript.Options
27optimize :: Options -> JS -> JS
27optimize :: Options -> JS -> JS
28optimize opts =
28optimize opts =
29 collapseNestedBlocks
29 collapseNestedBlocks
30 . tco opts
31 . tco opts
31 . removeUnusedVariables
32 . removeUnusedVariables
@@ -195,6 +196,26 @@ tco' = everywhere (mkT convert)
195 isSelfCall ident (JSApp fn _) = isSelfCall ident fn
196 isSelfCall ident (JSApp fn _) = isSelfCall ident fn
196 isSelfCall _ _ = False
197 isSelfCall _ _ = False
199+magicDo :: Options -> JS -> JS
200+magicDo opts | optionsMagicDo opts = magicDo'
204+magicDo' = everywhere (mkT undo) . everywhere (mkT convert)
206+ fnName = Ident "__do"
208+ convert (JSApp (JSApp (bind) [m]) [JSFunction Nothing [Ident "_"] (JSBlock [JSReturn ret])]) | isBind bind =
209+ JSFunction (Just fnName) [] $ JSBlock [ JSApp m [], JSApp ret [] ]
210+ convert (JSApp (JSApp (bind) [m]) [JSFunction Nothing [arg] (JSBlock [JSReturn ret])]) | isBind bind =
211+ JSFunction (Just fnName) [] $ JSBlock [ JSVariableIntroduction arg (Just (JSApp m [])), JSApp ret [] ]
212+ convert other = other
213+ isBind (JSAccessor "bind" (JSAccessor "eff" (JSVar (Ident "Eff")))) = True
216+ undo (JSApp (JSFunction (Just ident) [] body) []) | ident == fnName = body
198collapseNestedBlocks :: JS -> JS
219collapseNestedBlocks :: JS -> JS
199collapseNestedBlocks = everywhere (mkT collapse)
220collapseNestedBlocks = everywhere (mkT collapse)