@@ -51,11 +51,21 @@ optimize js = do
5151optimize' :: (Monad m, MonadReader Options m, Applicative m, MonadSupply m) => JS -> m JS
5252optimize' js = do
5353 opts <- ask
54− untilFixedPoint (inlineFnComposition . applyAll
54+ js' <- untilFixedPoint (inlineFnComposition . tidyUp . applyAll
55+ [ inlineCommonValues
56+ , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
57+ , inlineOperator (C.dataFunction, C.apply) $ \f x -> JSApp f [x]
58+ , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
59+ , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> JSApp f [x]
60+ , inlineOperator (C.dataArrayUnsafe, C.unsafeIndex) $ flip JSIndexer
61+ , inlineCommonOperators
62+ ]) js
63+ untilFixedPoint (return . tidyUp) . tco opts . magicDo opts $ js'
64+ where
65+ tidyUp :: JS -> JS
66+ tidyUp = applyAll
5567 [ collapseNestedBlocks
5668 , collapseNestedIfs
57− , tco opts
58− , magicDo opts
5969 , removeCodeAfterReturnStatements
6070 , removeUnusedArg
6171 , removeUndefinedApp
@@ -63,13 +73,7 @@ optimize' js = do
6373 , etaConvert
6474 , evaluateIifes
6575 , inlineVariables
66− , inlineValues
67− , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
68− , inlineOperator (C.dataFunction, C.apply) $ \f x -> JSApp f [x]
69− , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
70− , inlineOperator (C.dataFunction, C.applyFlipped) $ \x f -> JSApp f [x]
71− , inlineOperator (C.dataArrayUnsafe, C.unsafeIndex) $ flip JSIndexer
72− , inlineCommonOperators ]) js
76+ ]
7377
7478untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
7579untilFixedPoint f = go