@@ -212,6 +212,35 @@ jsLet name value body =
212212 )
213213 ) [value]
214214
215+optimizeJS :: JS -> JS
216+optimizeJS (JSApp
217+ (JSFunction [arg] (JSReturn (JSNew con [tag, JSArray vals])))
218+ [val]
219+ ) =
220+ JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
221+ where subst :: String -> [JS] -> JS -> [JS]
222+ subst _ [] _ = []
223+ subst var (x@(JSVar old) : xs) new
224+ | var == translateVariableName old = new : xs
225+ | otherwise = x : subst var xs new
226+
227+optimizeJS (JSSeq seq) =
228+ JSSeq (map optimizeJS seq)
229+
230+optimizeJS (JSFunction args body) =
231+ JSFunction args (optimizeJS body)
232+
233+optimizeJS (JSApp fun args) =
234+ JSApp (optimizeJS fun) (map optimizeJS args)
235+
236+optimizeJS (JSReturn js) =
237+ JSReturn $ optimizeJS js
238+
239+optimizeJS (JSAlloc name (Just js)) =
240+ JSAlloc name (Just $ optimizeJS js)
241+
242+optimizeJS js = js
243+
215244codegenJavaScript
216245 :: JSTarget
217246 -> [(Name, SDecl)]
@@ -241,7 +270,7 @@ codegenJavaScript target definitions filename outputType = do
241270 def = map (first translateNamespace) definitions
242271
243272 functions :: [String]
244− functions = map (compileJS . translateDeclaration) def
273+ functions = map (compileJS . optimizeJS . translateDeclaration) def
245274
246275 mainLoop :: String
247276 mainLoop = compileJS $