@@ -6,6 +6,7 @@ module Language.PureScript.CodeGen.JS.Optimizer.Inliner
66 , inlineCommonValues
77 , inlineCommonOperators
88 , inlineFnComposition
9+ , inlineUnsafePartial
910 , etaConvert
1011 , unThunk
1112 , evaluateIifes
@@ -66,6 +67,8 @@ evaluateIifes = everywhereOnJS convert
6667 where
6768 convert :: JS -> JS
6869 convert (JSApp _ (JSFunction _ Nothing [] (JSBlock _ [JSReturn _ ret])) []) = ret
70+ convert (JSApp _ (JSFunction _ Nothing idents (JSBlock _ [JSReturn ss ret])) [])
71+ | not (any (`isReassigned` ret) idents) = replaceIdents (map (, JSVar ss C.undefined) idents) ret
6972 convert js = js
7073
7174inlineVariables :: JS -> JS
@@ -249,10 +252,9 @@ inlineCommonOperators = applyAll $
249252
250253-- (f <<< g $ x) = f (g x)
251254-- (f <<< g) = \x -> f (g x)
252−inlineFnComposition :: (MonadSupply m) => JS -> m JS
253−inlineFnComposition = everywhereOnJSTopDownM convert
254− where
255− convert :: (MonadSupply m) => JS -> m JS
255+inlineFnComposition :: forall m. MonadSupply m => JS -> m JS
256+inlineFnComposition = everywhereOnJSTopDownM convert where
257+ convert :: JS -> m JS
256258 convert (JSApp s1 (JSApp s2 (JSApp _ (JSApp _ fn [dict']) [x]) [y]) [z])
257259 | isFnCompose dict' fn = return $ JSApp s1 x [JSApp s2 y [z]]
258260 | isFnComposeFlipped dict' fn = return $ JSApp s2 y [JSApp s1 x [z]]
@@ -273,6 +275,15 @@ inlineFnComposition = everywhereOnJSTopDownM convert
273275 fnComposeFlipped :: forall a b. (IsString a, IsString b) => (a, b)
274276 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
275277
278+inlineUnsafePartial :: JS -> JS
279+inlineUnsafePartial = everywhereOnJSTopDown convert where
280+ convert (JSApp ss (JSIndexer _ (JSStringLiteral _ unsafePartial) (JSVar _ partialUnsafe)) [ comp ])
281+ | unsafePartial == C.unsafePartial && partialUnsafe == C.partialUnsafe
282+ -- Apply to undefined here, the application should be optimized away
283+ -- if it is safe to do so
284+ = JSApp ss comp [ JSVar ss C.undefined ]
285+ convert other = other
286+
276287semiringNumber :: forall a b. (IsString a, IsString b) => (a, b)
277288semiringNumber = (C.dataSemiring, C.semiringNumber)
278289