@@ -20,11 +20,13 @@ module Language.PureScript.CodeGen.JS.Optimizer.Inliner (
20 inlineCommonOperators,
20 inlineCommonOperators,
21 inlineAppliedArrComposition,
21 inlineAppliedArrComposition,
22 inlineAppliedVars,
22 inlineAppliedVars,
23+ inlineArrComposition,
23 etaConvert,
24 etaConvert,
25 evaluateIifes
26 evaluateIifes
29+import Control.Monad.Supply.Class (MonadSupply, freshName)
28import Data.Maybe (fromMaybe)
30import Data.Maybe (fromMaybe)
30import Language.PureScript.CodeGen.JS.AST
32import Language.PureScript.CodeGen.JS.AST
@@ -254,6 +256,15 @@ inlineAppliedVars = everywhereOnJS convert
254 convert (JSApp (JSFunction Nothing [a] (JSBlock [JSReturn b])) [JSVar x]) = replaceIdent a (JSVar x) b
256 convert (JSApp (JSFunction Nothing [a] (JSBlock [JSReturn b])) [JSVar x]) = replaceIdent a (JSVar x) b
255 convert other = other
257 convert other = other
259+inlineArrComposition :: (MonadSupply m) => JS -> m JS
260+inlineArrComposition js = everywhereOnJSTopDownM convert js
262+ convert :: (MonadSupply m) => JS -> m JS
263+ convert (JSApp (JSApp (JSApp fn [dict']) [x]) [y]) | isDict semigroupoidArr dict' && isPreludeFn (C.<<<) fn = do
265+ return $ JSFunction Nothing [arg] (JSBlock [JSReturn $ JSApp x [JSApp y [JSVar arg]]])
266+ convert other = return other
257isDict :: (String, String) -> JS -> Bool
268isDict :: (String, String) -> JS -> Bool
258isDict (moduleName, dictName) (JSAccessor x (JSVar y)) = x == dictName && y == moduleName
269isDict (moduleName, dictName) (JSAccessor x (JSVar y)) = x == dictName && y == moduleName
259isDict _ _ = False
270isDict _ _ = False