@@ -86,7 +86,7 @@ valueToJs _ m e (Constructor (Qualified Nothing name)) =
8686 _ -> JSVar . Ident . runProperName $ name
8787valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
8888valueToJs 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)
9090valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
9191valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
9292valueToJs 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
144144qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
145145qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))
146146
147−bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> Gen JS
148−bindersToJs opts m e binders vals = do
149− setNextName $ firstUnusedName (binders, vals)
147+bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
148+bindersToJs opts m e binders vals = runGen (unusedNames (binders, vals)) $ do
150149 valNames <- replicateM (length vals) fresh
151150 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")])))
153152 vals
154153 where
155− go :: [String] -> [JS] -> [Binder] -> Maybe Guard -> Gen [JS]
154+ go :: [Ident] -> [JS] -> [Binder] -> Maybe Guard -> Gen [JS]
156155 go _ done [] Nothing = return done
157156 go _ done [] (Just cond) = return [JSIfElse (valueToJs opts m e cond) (JSBlock done) Nothing]
158157 go (v:vs) done' (b:bs) grd = do
@@ -160,24 +159,24 @@ bindersToJs opts m e binders vals = do
160159 binderToJs m e v done'' b
161160 go _ _ _ _ = error "Invalid arguments to bindersToJs"
162161
163−binderToJs :: ModuleName -> Environment -> String -> [JS] -> Binder -> Gen [JS]
162+binderToJs :: ModuleName -> Environment -> Ident -> [JS] -> Binder -> Gen [JS]
164163binderToJs _ _ _ done NullBinder = return done
165164binderToJs _ _ 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]
167166binderToJs _ _ 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]
169168binderToJs _ _ varName done (BooleanBinder True) =
170− return [JSIfElse (JSVar (Ident varName)) (JSBlock done) Nothing]
169+ return [JSIfElse (JSVar varName) (JSBlock done) Nothing]
171170binderToJs _ _ 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]
173172binderToJs _ _ varName done (VarBinder ident) =
174− return (JSVariableIntroduction ident (Just (JSVar (Ident varName))) : done)
173+ return (JSVariableIntroduction ident (Just (JSVar varName)) : done)
175174binderToJs 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]
177176binderToJs m e varName done (UnaryBinder ctor b) = do
178177 value <- fresh
179178 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]
181180binderToJs m e varName done (ObjectBinder bs) = go done bs
182181 where
183182 go :: [JS] -> [(String, Binder)] -> Gen [JS]
@@ -186,10 +185,10 @@ binderToJs m e varName done (ObjectBinder bs) = go done bs
186185 propVar <- fresh
187186 done'' <- go done' bs'
188187 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)
190189binderToJs m e varName done (ArrayBinder bs) = do
191190 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]
193192 where
194193 go :: [JS] -> Integer -> [Binder] -> Gen [JS]
195194 go done' _ [] = return done'
@@ -197,20 +196,20 @@ binderToJs m e varName done (ArrayBinder bs) = do
197196 elVar <- fresh
198197 done'' <- go done' (index + 1) bs'
199198 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)
201200binderToJs m e varName done (ConsBinder headBinder tailBinder) = do
202201 headVar <- fresh
203202 tailVar <- fresh
204203 js1 <- binderToJs m e headVar done headBinder
205204 js2 <- binderToJs m e tailVar js1 tailBinder
206− return [JSIfElse (JSBinary GreaterThan (JSAccessor "length" (JSVar (Ident varName))) (JSNumericLiteral (Left 0))) (JSBlock
207− ( JSVariableIntroduction (Ident headVar) (Just (JSIndexer (JSNumericLiteral (Left 0)) (JSVar (Ident varName)))) :
208− JSVariableIntroduction (Ident tailVar) (Just (JSApp (JSAccessor "slice" (JSVar (Ident varName))) [JSNumericLiteral (Left 1)])) :
205+ return [JSIfElse (JSBinary GreaterThan (JSAccessor "length" (JSVar varName)) (JSNumericLiteral (Left 0))) (JSBlock
206+ ( JSVariableIntroduction headVar (Just (JSIndexer (JSNumericLiteral (Left 0)) (JSVar varName))) :
207+ JSVariableIntroduction tailVar (Just (JSApp (JSAccessor "slice" (JSVar varName)) [JSNumericLiteral (Left 1)])) :
209208 js2
210209 )) Nothing]
211210binderToJs m e varName done (NamedBinder ident binder) = do
212211 js <- binderToJs m e varName done binder
213− return (JSVariableIntroduction ident (Just (JSVar (Ident varName))) : js)
212+ return (JSVariableIntroduction ident (Just (JSVar varName)) : js)
214213
215214statementToJs :: Options -> ModuleName -> Environment -> Statement -> JS
216215statementToJs opts m e (VariableIntroduction ident value) = JSVariableIntroduction ident (Just (valueToJs opts m e value))