@@ -175,26 +175,22 @@ toJS' (C txt span expr) =
175175 Case e cases -> caseToJS span e cases
176176 _ -> toJS expr
177177
178−recordToJS e loop cmds =
178+recordToJS e cmds =
179179 do e' <- toJS' e
180− return $ jsFunc "" (concat [ assign "r" "{_:[true]}"
181− , assign "e" e'
182− , "\nfor(var i in e){", loop, "}"
180+ return $ jsFunc "" (concat [ assign "r" ("Object.create" ++ parens e')
183181 , cmds
184182 , ret "r" ]) ++ "()"
185183
186−remove x = concat [ "\n if (i!='", x, "') { r[i]=e[i]; }"
187− , "\n else if (e[i].length>1) { r[i]=e[i].slice(1); }" ]
188184addField (x,e) = ((++add) . assign "v") `liftM` toJS' e
189− where add = concat [ "\nif (r.hasOwnProperty('", x, "')) {"
190− , "\n r.", x, " = r.", x, ".slice(0);"
191− , "\n r.", x, ".unshift(v);"
185+ where add = concat [ "\nif ('", x, "' in r) {"
186+ , "\n r.", x, " = [v].concat(r.", x, ");"
192187 , "\n} else { r.", x, " = [v]; }" ]
193188setField (x,e) = do
194− set <- globalAssign ("r." ++ x ++ "[0]") `liftM` toJS' e
195− return (globalAssign ("r." ++ x) ("r." ++ x ++ ".slice(0)") ++ set)
189+ let rx = "r." ++ x
190+ set <- globalAssign (rx ++ "[0]") `liftM` toJS' e
191+ return (globalAssign rx (rx ++ ".slice(0)") ++ set)
196192access x e = jsFunc "r" (ret body) ++ parens e
197− where body = "r.hasOwnProperty('_') ? r." ++ x ++ "[0] : r." ++ x
193+ where body = "'_' in r ? r." ++ x ++ "[0] : r." ++ x
198194makeRecord kvs = do
199195 kvs' <- (Map.toList . foldl' combine Map.empty) `liftM` mapM prep kvs
200196 let fs = map (\(k,vs) -> k ++ " : " ++ jsList vs) kvs' ++ ["_ : [true]"]
@@ -216,9 +212,9 @@ instance ToJS Expr where
216212 Boolean b -> return $ if b then "true" else "false"
217213 Range lo hi -> jsRange `liftM` toJS' lo `ap` toJS' hi
218214 Access e x -> access x `liftM` toJS' e
219− Remove e x -> recordToJS e (remove x) ""
220− Insert e x v -> recordToJS e "r[i]=e[i];" =<< addField (x,v)
221− Modify e fs -> recordToJS e "r[i]=e[i];" . concat =<< mapM setField fs
215+ Remove e x -> recordToJS e ("\ndelete r." ++ x ++ ";")
216+ Insert e x v -> recordToJS e =<< addField (x,v)
217+ Modify e fs -> recordToJS e . concat =<< mapM setField fs
222218 Record fs -> makeRecord fs
223219 Binop op e1 e2 -> binop op `liftM` toJS' e1 `ap` toJS' e2
224220