@@ -175,26 +175,22 @@ toJS' (C txt span expr) =
175 Case e cases -> caseToJS span e cases
175 Case e cases -> caseToJS span e cases
176 _ -> toJS expr
176 _ -> toJS expr
178−recordToJS e loop cmds =
178+recordToJS e cmds =
179 do e' <- toJS' e
179 do e' <- toJS' e
180− return $ jsFunc "" (concat [ assign "r" "{_:[true]}"
180+ return $ jsFunc "" (concat [ assign "r" ("Object.create" ++ parens e')
182− , "\nfor(var i in e){", loop, "}"
184 , ret "r" ]) ++ "()"
182 , ret "r" ]) ++ "()"
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); }" ]
188addField (x,e) = ((++add) . assign "v") `liftM` toJS' e
184addField (x,e) = ((++add) . assign "v") `liftM` toJS' e
189− where add = concat [ "\nif (r.hasOwnProperty('", x, "')) {"
185+ where add = concat [ "\nif ('", x, "' in r) {"
190− , "\n r.", x, " = r.", x, ".slice(0);"
186+ , "\n r.", x, " = [v].concat(r.", x, ");"
191− , "\n r.", x, ".unshift(v);"
192 , "\n} else { r.", x, " = [v]; }" ]
187 , "\n} else { r.", x, " = [v]; }" ]
193setField (x,e) = do
188setField (x,e) = do
194− set <- globalAssign ("r." ++ x ++ "[0]") `liftM` toJS' e
190+ set <- globalAssign (rx ++ "[0]") `liftM` toJS' e
195− return (globalAssign ("r." ++ x) ("r." ++ x ++ ".slice(0)") ++ set)
191+ return (globalAssign rx (rx ++ ".slice(0)") ++ set)
196access x e = jsFunc "r" (ret body) ++ parens e
192access 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
198makeRecord kvs = do
194makeRecord kvs = do
199 kvs' <- (Map.toList . foldl' combine Map.empty) `liftM` mapM prep kvs
195 kvs' <- (Map.toList . foldl' combine Map.empty) `liftM` mapM prep kvs
200 let fs = map (\(k,vs) -> k ++ " : " ++ jsList vs) kvs' ++ ["_ : [true]"]
196 let fs = map (\(k,vs) -> k ++ " : " ++ jsList vs) kvs' ++ ["_ : [true]"]
@@ -216,9 +212,9 @@ instance ToJS Expr where
216 Boolean b -> return $ if b then "true" else "false"
212 Boolean b -> return $ if b then "true" else "false"
217 Range lo hi -> jsRange `liftM` toJS' lo `ap` toJS' hi
213 Range lo hi -> jsRange `liftM` toJS' lo `ap` toJS' hi
218 Access e x -> access x `liftM` toJS' e
214 Access e x -> access x `liftM` toJS' e
219− Remove e x -> recordToJS e (remove x) ""
215+ Remove e x -> recordToJS e ("\ndelete r." ++ x ++ ";")
220− Insert e x v -> recordToJS e "r[i]=e[i];" =<< addField (x,v)
216+ Insert e x v -> recordToJS e =<< addField (x,v)
221− Modify e fs -> recordToJS e "r[i]=e[i];" . concat =<< mapM setField fs
217+ Modify e fs -> recordToJS e . concat =<< mapM setField fs
222 Record fs -> makeRecord fs
218 Record fs -> makeRecord fs
223 Binop op e1 e2 -> binop op `liftM` toJS' e1 `ap` toJS' e2
219 Binop op e1 e2 -> binop op `liftM` toJS' e1 `ap` toJS' e2