@@ -51,11 +51,21 @@ optimize js = do
51optimize' :: (Monad m, MonadReader Options m, Applicative m, MonadSupply m) => JS -> m JS
51optimize' :: (Monad m, MonadReader Options m, Applicative m, MonadSupply m) => JS -> m JS
52optimize' js = do
52optimize' js = do
53 opts <- ask
53 opts <- ask
54− untilFixedPoint (inlineFnComposition . applyAll
54+ js' <- untilFixedPoint (inlineFnComposition . tidyUp . applyAll
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
63+ untilFixedPoint (return . tidyUp) . tco opts . magicDo opts $ js'
55 [ collapseNestedBlocks
67 [ collapseNestedBlocks
56 , collapseNestedIfs
68 , collapseNestedIfs
59 , removeCodeAfterReturnStatements
69 , removeCodeAfterReturnStatements
60 , removeUnusedArg
70 , removeUnusedArg
61 , removeUndefinedApp
71 , removeUndefinedApp
@@ -63,13 +73,7 @@ optimize' js = do
63 , etaConvert
73 , etaConvert
64 , evaluateIifes
74 , evaluateIifes
65 , inlineVariables
75 , inlineVariables
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
74untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
78untilFixedPoint :: (Monad m, Eq a) => (a -> m a) -> a -> m a
75untilFixedPoint f = go
79untilFixedPoint f = go