@@ -36,6 +36,7 @@ internalImports =
3636
3737parens s = "(" ++ s ++ ")"
3838brackets s = "{" ++ s ++ "}"
39+jsObj = brackets . intercalate ", "
3940jsList ss = "["++ intercalate "," ss ++"]"
4041jsFunc args body = "function(" ++ args ++ "){" ++ indent body ++ "}"
4142assign x e = "\nvar " ++ x ++ " = " ++ e ++ ";"
@@ -79,7 +80,7 @@ getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
7980 opPair op = "'" ++ op ++ "' : $op['" ++ op ++ "']"
8081 fnPair fn = let fn' = derename fn in "_." ++ fn' ++ " = " ++ fn
8182
82− op = ("_.$op = "++) . brackets . intercalate ", " $ map opPair ops
83+ op = ("_.$op = "++) . jsObj $ map opPair ops
8384
8485 get' (FnDef x _ _) = Left x
8586 get' (OpDef op _ _ _) = Right op
@@ -94,25 +95,26 @@ getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
9495jsImport (modul, how) =
9596 case how of
9697 As name -> assign name ("Elm." ++ modul ++ parens "elm")
97− Importing vs ->
98− "\nvar $ = Elm." ++ modul ++ parens "elm" ++ ";" ++ setup modul ++
99− if null vs then "\nfor (var k in $) {eval('var '+k+'=$[\"'+k+'\"]')}"
100− else "\nvar " ++ intercalate ", " (map def vs) ++ ";"
98+ Hiding vs -> include ++ " var hiding=" ++ (jsObj $ map (++":1") vs) ++
99+ "; for(var k in _){if(k in hiding)continue;" ++
100+ "eval('var '+k+'=_[\"'+k+'\"]')}"
101+ Importing vs -> include ++ "\nvar " ++ intercalate ", " (map def vs) ++ ";"
102+ where
103+ imprt v = assign' v ("_." ++ v)
104+ def (o:p) = imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
105+ where
106+ include = "\nvar _ = Elm." ++ modul ++ parens "elm" ++ ";" ++ setup modul
107+ setup moduleName = " var " ++ concatMap (++";") (defs ++ [assign' moduleName "_"])
101108 where
102− imprt v = assign' v ("$." ++ v)
103− def (o:p) = imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
104− setup moduleName =
105− "\nvar " ++ concatMap (++";") (defs ++ [assign' moduleName "$"])
106− where
107− defs = map (\n -> assign' n (n ++ "||{}")) (subnames moduleName)
108− subnames = map (intercalate ".") . tail . inits . init . split
109− split names = case go [] names of
110− (name, []) -> [name]
111− (name, ns) -> name : split ns
112− go name str = case str of
113− '.':rest -> (reverse name, rest)
114− c:rest -> go (c:name) rest
115− [] -> (reverse name, [])
109+ defs = map (\n -> assign' n (n ++ "||{}")) (subnames moduleName)
110+ subnames = map (intercalate ".") . tail . inits . init . split
111+ split names = case go [] names of
112+ (name, []) -> [name]
113+ (name, ns) -> name : split ns
114+ go name str = case str of
115+ '.':rest -> (reverse name, rest)
116+ c:rest -> go (c:name) rest
117+ [] -> (reverse name, [])
116118
117119
118120
@@ -226,7 +228,7 @@ instance ToJS Expr where
226228 return $ case name of
227229 "Nil" -> jsNil
228230 "Cons" -> jsCons (head fs) ((head . tail) fs)
229− _ -> brackets $ "ctor:" ++ show name ++ concatMap (", "++) fields
231+ _ -> jsObj $ ("ctor:" ++ show name) : fields
230232 where fields = zipWith (\n e -> "_" ++ show n ++ ":" ++ e) [0..] fs
231233
232234 Markdown doc -> return $ "text('" ++ pad ++ md ++ pad ++ "')"