@@ -21,6 +21,7 @@ module Language.PureScript.CodeGen.Cpp.Optimizer.Inliner
2121 , inlineOperator
2222 , inlineCommonOperators
2323 , inlineFnComposition
24+ , inlineUnsafePartial
2425 , etaConvert
2526 , unThunk
2627 , evaluateIifes
@@ -269,10 +270,9 @@ inlineCommonOperators = applyAll $
269270
270271-- (f <<< g $ x) = f (g x)
271272-- (f <<< g) = \x -> f (g x)
272−inlineFnComposition :: (MonadSupply m) => Cpp -> m Cpp
273−inlineFnComposition = everywhereOnCppTopDownM convert
274− where
275− convert :: (MonadSupply m) => Cpp -> m Cpp
273+inlineFnComposition :: forall m. MonadSupply m => Cpp -> m Cpp
274+inlineFnComposition = everywhereOnCppTopDownM convert where
275+ convert :: Cpp -> m Cpp
276276 convert (CppApp fn [dict', x, y, z])
277277 | isFnCompose dict' fn = return $ CppApp x [CppApp y [z]]
278278 | isFnComposeFlipped dict' fn = return $ CppApp y [CppApp x [z]]
@@ -303,6 +303,15 @@ inlineFnComposition = everywhereOnCppTopDownM convert
303303 fnComposeFlipped :: (Text, Text)
304304 fnComposeFlipped = (C.controlSemigroupoid, C.composeFlipped)
305305
306+inlineUnsafePartial :: Cpp -> Cpp
307+inlineUnsafePartial = everywhereOnCppTopDown convert where
308+ convert (CppApp (CppAccessor (CppVar unsafePartial) (CppVar partialUnsafe)) [ comp ])
309+ | unsafePartial == C.unsafePartial && partialUnsafe == C.partialUnsafe
310+ -- Apply to undefined here, the application should be optimized away
311+ -- if it is safe to do so
312+ = CppApp comp [ CppVar C.undefined ]
313+ convert other = other
314+
306315toAutoVars :: Cpp -> Cpp
307316toAutoVars = everywhereOnCpp convert
308317 where