git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Inlined `<>` for string, `<<<` and `>>>` for `->`.
0b6d007joneshf
src/Language/PureScript/Constants.hs+18
@@ -23,6 +23,15 @@ module Language.PureScript.Constants where
23(#) :: String
23(#) :: String
24(#) = "#"
24(#) = "#"
25
25
26+(<<<) :: String
27+(<<<) = "<<<"
28+
29+(>>>) :: String
30+(>>>) = ">>>"
31+
32+(<>) :: String
33+(<>) = "<>"
34+
26(++) :: String
35(++) :: String
27(++) = "++"
36(++) = "++"
28
37
@@ -105,6 +114,9 @@ not = "not"
105return :: String
114return :: String
106return = "return"
115return = "return"
107
116
117+pure' :: String
118+pure' = "pure"
119+
108returnEscaped :: String
120returnEscaped :: String
109returnEscaped = "$return"
121returnEscaped = "$return"
110
122
@@ -152,6 +164,9 @@ runFn = "runFn"
152monadEffDictionary :: String
164monadEffDictionary :: String
153monadEffDictionary = "monadEff"
165monadEffDictionary = "monadEff"
154
166
167+applicativeEffDictionary :: String
168+applicativeEffDictionary = "applicativeEff"
169+
155bindEffDictionary :: String
170bindEffDictionary :: String
156bindEffDictionary = "bindEff"
171bindEffDictionary = "bindEff"
157
172
@@ -179,6 +194,9 @@ boolLikeBoolean = "boolLikeBoolean"
179semigroupString :: String
194semigroupString :: String
180semigroupString = "semigroupString"
195semigroupString = "semigroupString"
181
196
197+semigroupoidArr :: String
198+semigroupoidArr = "semigroupoidArr"
199+
182-- Main module
200-- Main module
183
201
184main :: String
202main :: String
src/Language/PureScript/Optimizer.hs+2
@@ -61,6 +61,8 @@ optimize opts | optionsNoOptimizations opts = id
61 , etaConvert
61 , etaConvert
62 , evaluateIifes
62 , evaluateIifes
63 , inlineVariables
63 , inlineVariables
64+ , inlinePure
65+ , inlineCompose
64 , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
66 , inlineOperator (C.prelude, (C.$)) $ \f x -> JSApp f [x]
65 , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
67 , inlineOperator (C.prelude, (C.#)) $ \x f -> JSApp f [x]
66 , inlineOperator (C.preludeUnsafe, C.unsafeIndex) $ flip JSIndexer
68 , inlineOperator (C.preludeUnsafe, C.unsafeIndex) $ flip JSIndexer
src/Language/PureScript/Optimizer/Inliner.hs+28
@@ -15,6 +15,8 @@
15
15
16module Language.PureScript.Optimizer.Inliner (
16module Language.PureScript.Optimizer.Inliner (
17 inlineVariables,
17 inlineVariables,
18+ inlinePure,
19+ inlineCompose,
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
73
75
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+
74inlineVariables :: JS -> JS
101inlineVariables :: JS -> JS
75inlineVariables = everywhereOnJS $ removeFromBlock go
102inlineVariables = everywhereOnJS $ removeFromBlock go
76 where
103 where
@@ -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
114
141
142+ , binary C.semigroupString (C.<>) Add
115 , binary C.semigroupString (C.++) Add
143 , binary C.semigroupString (C.++) Add
116
144
117 , binaryFunction C.bitsNumber C.shl ShiftLeft
145 , binaryFunction C.bitsNumber C.shl ShiftLeft