@@ -15,6 +15,8 @@
16module Language.PureScript.Optimizer.Inliner (
16module Language.PureScript.Optimizer.Inliner (
17 inlineVariables,
17 inlineVariables,
18 inlineOperator,
20 inlineOperator,
19 inlineCommonOperators,
21 inlineCommonOperators,
20 etaConvert,
22 etaConvert,
@@ -71,6 +73,31 @@ evaluateIifes = everywhereOnJS convert
71 convert (JSApp (JSFunction Nothing [] (JSBlock [JSReturn ret])) []) = ret
73 convert (JSApp (JSFunction Nothing [] (JSBlock [JSReturn ret])) []) = ret
72 convert js = js
74 convert js = js
76+inlinePure :: JS -> JS
77+inlinePure = everywhereOnJS convert
80+ convert (JSApp (JSApp p eff) [js]) | isPure p && isEff eff = JSFunction Nothing [] (JSBlock [JSReturn js])
81+ convert other = other
82+ isPure (JSAccessor f (JSVar prelude)) = (f == C.pure' || f == C.return) && prelude == C.prelude
84+ isEff [JSApp (JSAccessor app (JSVar eff)) _] = app == C.applicativeEffDictionary && eff == C.eff
87+inlineCompose :: JS -> JS
88+inlineCompose = everywhereOnJS convert
91+ convert (JSApp (JSApp comp [f]) [g]) | isBackwardComp comp = JSFunction Nothing ["x"] (JSBlock [JSReturn (JSApp f [JSApp g [JSVar "x"]])])
92+ convert (JSApp (JSApp comp [f]) [g]) | isForwardComp comp = JSFunction Nothing ["x"] (JSBlock [JSReturn (JSApp g [JSApp f [JSVar "x"]])])
93+ convert other = other
94+ isBackwardComp (JSApp (JSIndexer (JSStringLiteral comp) (JSVar prelude)) semi) = comp == (C.<<<) && prelude == C.prelude && isSemi semi
95+ isBackwardComp _ = False
96+ isForwardComp (JSApp (JSIndexer (JSStringLiteral comp) (JSVar prelude)) semi) = comp == (C.>>>) && prelude == C.prelude && isSemi semi
97+ isForwardComp _ = False
98+ isSemi [JSApp (JSAccessor semi (JSVar prelude)) _] = semi == C.semigroupoidArr && prelude == C.prelude
74inlineVariables :: JS -> JS
101inlineVariables :: JS -> JS
75inlineVariables = everywhereOnJS $ removeFromBlock go
102inlineVariables = everywhereOnJS $ removeFromBlock go
@@ -112,6 +139,7 @@ inlineCommonOperators = applyAll $
112 , binary C.eqBoolean (C.==) EqualTo
139 , binary C.eqBoolean (C.==) EqualTo
113 , binary C.eqBoolean (C./=) NotEqualTo
140 , binary C.eqBoolean (C./=) NotEqualTo
142+ , binary C.semigroupString (C.<>) Add
115 , binary C.semigroupString (C.++) Add
143 , binary C.semigroupString (C.++) Add
117 , binaryFunction C.bitsNumber C.shl ShiftLeft
145 , binaryFunction C.bitsNumber C.shl ShiftLeft