@@ -27,6 +27,7 @@ import Language.PureScript.Options
2727optimize :: Options -> JS -> JS
2828optimize opts =
2929 collapseNestedBlocks
30+ . magicDo opts
3031 . tco opts
3132 . removeUnusedVariables
3233 . unThunk
@@ -195,6 +196,26 @@ tco' = everywhere (mkT convert)
195196 isSelfCall ident (JSApp fn _) = isSelfCall ident fn
196197 isSelfCall _ _ = False
197198
199+magicDo :: Options -> JS -> JS
200+magicDo opts | optionsMagicDo opts = magicDo'
201+ | otherwise = id
202+
203+magicDo' :: JS -> JS
204+magicDo' = everywhere (mkT undo) . everywhere (mkT convert)
205+ where
206+ fnName = Ident "__do"
207+ convert :: JS -> JS
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
214+ isBind _ = False
215+ undo :: JS -> JS
216+ undo (JSApp (JSFunction (Just ident) [] body) []) | ident == fnName = body
217+ undo other = other
218+
198219collapseNestedBlocks :: JS -> JS
199220collapseNestedBlocks = everywhere (mkT collapse)
200221 where