@@ -86,7 +86,7 @@ valueToJs _ m e (Constructor (Qualified Nothing name)) =
86 _ -> JSVar . Ident . runProperName $ name
86 _ -> JSVar . Ident . runProperName $ name
87valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
87valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
88valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
88valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
89−valueToJs opts m e (Case values binders) = runGen (bindersToJs opts m e binders (map (valueToJs opts m e) values))
89+valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
90valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
90valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
91valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
91valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
92valueToJs opts m e (Indexer index val) = JSIndexer (valueToJs opts m e index) (valueToJs opts m e val)
92valueToJs opts m e (Indexer index val) = JSIndexer (valueToJs opts m e index) (valueToJs opts m e val)
@@ -144,15 +144,14 @@ qualifiedToJS :: (a -> String) -> Qualified a -> JS
144qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
144qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
145qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))
145qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))
147−bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> Gen JS
147+bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
148−bindersToJs opts m e binders vals = do
148+bindersToJs opts m e binders vals = runGen (unusedNames (binders, vals)) $ do
149− setNextName $ firstUnusedName (binders, vals)
150 valNames <- replicateM (length vals) fresh
149 valNames <- replicateM (length vals) fresh
151 jss <- forM binders $ \(bs, grd, result) -> go valNames [JSReturn (valueToJs opts m e result)] bs grd
150 jss <- forM binders $ \(bs, grd, result) -> go valNames [JSReturn (valueToJs opts m e result)] bs grd
152− return $ JSApp (JSFunction Nothing (map Ident valNames) (JSBlock (concat jss ++ [JSThrow (JSStringLiteral "Failed pattern match")])))
151+ return $ JSApp (JSFunction Nothing valNames (JSBlock (concat jss ++ [JSThrow (JSStringLiteral "Failed pattern match")])))
155− go :: [String] -> [JS] -> [Binder] -> Maybe Guard -> Gen [JS]
154+ go :: [Ident] -> [JS] -> [Binder] -> Maybe Guard -> Gen [JS]
156 go _ done [] Nothing = return done
155 go _ done [] Nothing = return done
157 go _ done [] (Just cond) = return [JSIfElse (valueToJs opts m e cond) (JSBlock done) Nothing]
156 go _ done [] (Just cond) = return [JSIfElse (valueToJs opts m e cond) (JSBlock done) Nothing]
158 go (v:vs) done' (b:bs) grd = do
157 go (v:vs) done' (b:bs) grd = do
@@ -160,24 +159,24 @@ bindersToJs opts m e binders vals = do
160 binderToJs m e v done'' b
159 binderToJs m e v done'' b
161 go _ _ _ _ = error "Invalid arguments to bindersToJs"
160 go _ _ _ _ = error "Invalid arguments to bindersToJs"
163−binderToJs :: ModuleName -> Environment -> String -> [JS] -> Binder -> Gen [JS]
162+binderToJs :: ModuleName -> Environment -> Ident -> [JS] -> Binder -> Gen [JS]
164binderToJs _ _ _ done NullBinder = return done
163binderToJs _ _ _ done NullBinder = return done
165binderToJs _ _ varName done (StringBinder str) =
164binderToJs _ _ varName done (StringBinder str) =
166− return [JSIfElse (JSBinary EqualTo (JSVar (Ident varName)) (JSStringLiteral str)) (JSBlock done) Nothing]
165+ return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSStringLiteral str)) (JSBlock done) Nothing]
167binderToJs _ _ varName done (NumberBinder num) =
166binderToJs _ _ varName done (NumberBinder num) =
168− return [JSIfElse (JSBinary EqualTo (JSVar (Ident varName)) (JSNumericLiteral num)) (JSBlock done) Nothing]
167+ return [JSIfElse (JSBinary EqualTo (JSVar varName) (JSNumericLiteral num)) (JSBlock done) Nothing]
169binderToJs _ _ varName done (BooleanBinder True) =
168binderToJs _ _ varName done (BooleanBinder True) =
170− return [JSIfElse (JSVar (Ident varName)) (JSBlock done) Nothing]
169+ return [JSIfElse (JSVar varName) (JSBlock done) Nothing]
171binderToJs _ _ varName done (BooleanBinder False) =
170binderToJs _ _ varName done (BooleanBinder False) =
172− return [JSIfElse (JSUnary Not (JSVar (Ident varName))) (JSBlock done) Nothing]
171+ return [JSIfElse (JSUnary Not (JSVar varName)) (JSBlock done) Nothing]
173binderToJs _ _ varName done (VarBinder ident) =
172binderToJs _ _ varName done (VarBinder ident) =
174− return (JSVariableIntroduction ident (Just (JSVar (Ident varName))) : done)
173+ return (JSVariableIntroduction ident (Just (JSVar varName)) : done)
175binderToJs m _ varName done (NullaryBinder ctor) =
174binderToJs m _ varName done (NullaryBinder ctor) =
176− return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar (Ident varName))) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ qualify m ctor)))) (JSBlock done) Nothing]
175+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ qualify m ctor)))) (JSBlock done) Nothing]
177binderToJs m e varName done (UnaryBinder ctor b) = do
176binderToJs m e varName done (UnaryBinder ctor b) = do
178 value <- fresh
177 value <- fresh
179 js <- binderToJs m e value done b
178 js <- binderToJs m e value done b
180− return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar (Ident varName))) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ qualify m ctor)))) (JSBlock (JSVariableIntroduction (Ident value) (Just (JSAccessor "value" (JSVar (Ident varName)))) : js)) Nothing]
179+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ qualify m ctor)))) (JSBlock (JSVariableIntroduction value (Just (JSAccessor "value" (JSVar varName))) : js)) Nothing]
181binderToJs m e varName done (ObjectBinder bs) = go done bs
180binderToJs m e varName done (ObjectBinder bs) = go done bs
183 go :: [JS] -> [(String, Binder)] -> Gen [JS]
182 go :: [JS] -> [(String, Binder)] -> Gen [JS]
@@ -186,10 +185,10 @@ binderToJs m e varName done (ObjectBinder bs) = go done bs
186 propVar <- fresh
185 propVar <- fresh
187 done'' <- go done' bs'
186 done'' <- go done' bs'
188 js <- binderToJs m e propVar done'' binder
187 js <- binderToJs m e propVar done'' binder
189− return (JSVariableIntroduction (Ident propVar) (Just (JSAccessor prop (JSVar (Ident varName)))) : js)
188+ return (JSVariableIntroduction propVar (Just (JSAccessor prop (JSVar varName))) : js)
190binderToJs m e varName done (ArrayBinder bs) = do
189binderToJs m e varName done (ArrayBinder bs) = do
191 js <- go done 0 bs
190 js <- go done 0 bs
192− return [JSIfElse (JSBinary EqualTo (JSAccessor "length" (JSVar (Ident varName))) (JSNumericLiteral (Left (fromIntegral $ length bs)))) (JSBlock js) Nothing]
191+ return [JSIfElse (JSBinary EqualTo (JSAccessor "length" (JSVar varName)) (JSNumericLiteral (Left (fromIntegral $ length bs)))) (JSBlock js) Nothing]
194 go :: [JS] -> Integer -> [Binder] -> Gen [JS]
193 go :: [JS] -> Integer -> [Binder] -> Gen [JS]
195 go done' _ [] = return done'
194 go done' _ [] = return done'
@@ -197,20 +196,20 @@ binderToJs m e varName done (ArrayBinder bs) = do
197 elVar <- fresh
196 elVar <- fresh
198 done'' <- go done' (index + 1) bs'
197 done'' <- go done' (index + 1) bs'
199 js <- binderToJs m e elVar done'' binder
198 js <- binderToJs m e elVar done'' binder
200− return (JSVariableIntroduction (Ident elVar) (Just (JSIndexer (JSNumericLiteral (Left index)) (JSVar (Ident varName)))) : js)
199+ return (JSVariableIntroduction elVar (Just (JSIndexer (JSNumericLiteral (Left index)) (JSVar varName))) : js)
201binderToJs m e varName done (ConsBinder headBinder tailBinder) = do
200binderToJs m e varName done (ConsBinder headBinder tailBinder) = do
202 headVar <- fresh
201 headVar <- fresh
203 tailVar <- fresh
202 tailVar <- fresh
204 js1 <- binderToJs m e headVar done headBinder
203 js1 <- binderToJs m e headVar done headBinder
205 js2 <- binderToJs m e tailVar js1 tailBinder
204 js2 <- binderToJs m e tailVar js1 tailBinder
206− return [JSIfElse (JSBinary GreaterThan (JSAccessor "length" (JSVar (Ident varName))) (JSNumericLiteral (Left 0))) (JSBlock
205+ return [JSIfElse (JSBinary GreaterThan (JSAccessor "length" (JSVar varName)) (JSNumericLiteral (Left 0))) (JSBlock
207− ( JSVariableIntroduction (Ident headVar) (Just (JSIndexer (JSNumericLiteral (Left 0)) (JSVar (Ident varName)))) :
206+ ( JSVariableIntroduction headVar (Just (JSIndexer (JSNumericLiteral (Left 0)) (JSVar varName))) :
208− JSVariableIntroduction (Ident tailVar) (Just (JSApp (JSAccessor "slice" (JSVar (Ident varName))) [JSNumericLiteral (Left 1)])) :
207+ JSVariableIntroduction tailVar (Just (JSApp (JSAccessor "slice" (JSVar varName)) [JSNumericLiteral (Left 1)])) :
210 )) Nothing]
209 )) Nothing]
211binderToJs m e varName done (NamedBinder ident binder) = do
210binderToJs m e varName done (NamedBinder ident binder) = do
212 js <- binderToJs m e varName done binder
211 js <- binderToJs m e varName done binder
213− return (JSVariableIntroduction ident (Just (JSVar (Ident varName))) : js)
212+ return (JSVariableIntroduction ident (Just (JSVar varName)) : js)
215statementToJs :: Options -> ModuleName -> Environment -> Statement -> JS
214statementToJs :: Options -> ModuleName -> Environment -> Statement -> JS
216statementToJs opts m e (VariableIntroduction ident value) = JSVariableIntroduction ident (Just (valueToJs opts m e value))
215statementToJs opts m e (VariableIntroduction ident value) = JSVariableIntroduction ident (Just (valueToJs opts m e value))