@@ -62,11 +62,11 @@ jsModule (Module names exports imports stmts) =
62 defs = assign "$op" "{}"
62 defs = assign "$op" "{}"
63 program = "\nvar " ++ usefulFuncs ++ ";" ++ defs ++ includes ++ body ++
63 program = "\nvar " ++ usefulFuncs ++ ";" ++ defs ++ includes ++ body ++
64 setup ("elm":"Native":modNames) ++
64 setup ("elm":"Native":modNames) ++
65− assign "_" ("elm.Native." ++ modName ++ " || {}") ++
65+ assign "_" ("elm.Native." ++ modName ++ "||{}") ++
66 getExports exports stmts ++ setup ("elm":modNames) ++
66 getExports exports stmts ++ setup ("elm":modNames) ++
67 ret (assign' ("elm." ++ modName) "_") ++ "\n"
67 ret (assign' ("elm." ++ modName) "_") ++ "\n"
68− setup modNames = concatMap (\n -> globalAssign n $ n ++ " || {}") .
68+ setup modNames = concatMap (\n -> globalAssign n $ n ++ "||{}") .
69− map (intercalate ".") . tail . inits $ init modNames
69+ map (intercalate ".") . drop 2 . inits $ init modNames
70 usefulFuncs = intercalate ", " (map (uncurry assign') internalImports)
70 usefulFuncs = intercalate ", " (map (uncurry assign') internalImports)
72getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
72getExports names stmts = "\n"++ intercalate ";\n" (op : map fnPair fns)
@@ -95,13 +95,25 @@ jsImport (modul, how) =
95 case how of
95 case how of
96 As name -> assign name ("Elm." ++ modul ++ parens "elm")
96 As name -> assign name ("Elm." ++ modul ++ parens "elm")
97 Importing vs ->
97 Importing vs ->
98− "\nvar $ = Elm." ++ modul ++ parens "elm" ++ ";" ++
98+ "\nvar $ = Elm." ++ modul ++ parens "elm" ++ ";" ++ setup modul ++
99 if null vs then "\nfor (var k in $) {eval('var '+k+'=$[\"'+k+'\"]')}"
99 if null vs then "\nfor (var k in $) {eval('var '+k+'=$[\"'+k+'\"]')}"
100 else "\nvar " ++ intercalate ", " (map def vs) ++ ";"
100 else "\nvar " ++ intercalate ", " (map def vs) ++ ";"
102 imprt v = assign' v ("$." ++ v)
102 imprt v = assign' v ("$." ++ v)
104− imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
103+ def (o:p) = imprt (if isOp o then "$op['" ++ o:p ++ "']" else deprime (o:p))
105+ "\nvar " ++ concatMap (++";") (defs ++ [assign' moduleName "$"])
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, [])
107stmtsToJS :: [Statement] -> String
119stmtsToJS :: [Statement] -> String