@@ -15,6 +15,8 @@
1515
1616module Language.PureScript.Optimizer.Inliner (
1717 inlineVariables,
18+ inlinePure,
19+ inlineCompose,
1820 inlineOperator,
1921 inlineCommonOperators,
2022 etaConvert,
@@ -71,6 +73,31 @@ evaluateIifes = everywhereOnJS convert
7173 convert (JSApp (JSFunction Nothing [] (JSBlock [JSReturn ret])) []) = ret
7274 convert js = js
7375
76+inlinePure :: JS -> JS
77+inlinePure = everywhereOnJS convert
78+ where
79+ convert :: JS -> JS
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
83+ isPure _ = False
84+ isEff [JSApp (JSAccessor app (JSVar eff)) _] = app == C.applicativeEffDictionary && eff == C.eff
85+ isEff _ = False
86+
87+inlineCompose :: JS -> JS
88+inlineCompose = everywhereOnJS convert
89+ where
90+ convert :: JS -> JS
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
99+ isSemi _ = False
100+
74101inlineVariables :: JS -> JS
75102inlineVariables = everywhereOnJS $ removeFromBlock go
76103 where
@@ -112,6 +139,7 @@ inlineCommonOperators = applyAll $
112139 , binary C.eqBoolean (C.==) EqualTo
113140 , binary C.eqBoolean (C./=) NotEqualTo
114141
142+ , binary C.semigroupString (C.<>) Add
115143 , binary C.semigroupString (C.++) Add
116144
117145 , binaryFunction C.bitsNumber C.shl ShiftLeft