@@ -17,7 +17,10 @@
18module Language.PureScript.CodeGen.JS.AST where
18module Language.PureScript.CodeGen.JS.AST where
20+import Control.Applicative (Applicative, (<$>), (<*>))
21+import Control.Monad.Identity
20import Data.Data
22import Data.Data
23+import Data.Traversable (traverse)
22import Language.PureScript.Comments
25import Language.PureScript.Comments
@@ -281,31 +284,34 @@ everywhereOnJS f = go
281 go other = f other
284 go other = f other
283everywhereOnJSTopDown :: (JS -> JS) -> JS -> JS
286everywhereOnJSTopDown :: (JS -> JS) -> JS -> JS
284−everywhereOnJSTopDown f = go . f
287+everywhereOnJSTopDown f = runIdentity . everywhereOnJSTopDownM (Identity . f)
289+everywhereOnJSTopDownM :: (Applicative m, Monad m) => (JS -> m JS) -> JS -> m JS
290+everywhereOnJSTopDownM f = f >=> go
286− go :: JS -> JS
292+ f' = f >=> go
287− go (JSUnary op j) = JSUnary op (go (f j))
293+ go (JSUnary op j) = JSUnary op <$> f' j
288− go (JSBinary op j1 j2) = JSBinary op (go (f j1)) (go (f j2))
294+ go (JSBinary op j1 j2) = JSBinary op <$> f' j1 <*> f' j2
289− go (JSArrayLiteral js) = JSArrayLiteral (map (go . f) js)
295+ go (JSArrayLiteral js) = JSArrayLiteral <$> traverse f' js
290− go (JSIndexer j1 j2) = JSIndexer (go (f j1)) (go (f j2))
296+ go (JSIndexer j1 j2) = JSIndexer <$> f' j1 <*> f' j2
291− go (JSObjectLiteral js) = JSObjectLiteral (map (fmap (go . f)) js)
297+ go (JSObjectLiteral js) = JSObjectLiteral <$> traverse (traverse f') js
292− go (JSAccessor prop j) = JSAccessor prop (go (f j))
298+ go (JSAccessor prop j) = JSAccessor prop <$> f' j
293− go (JSFunction name args j) = JSFunction name args (go (f j))
299+ go (JSFunction name args j) = JSFunction name args <$> f' j
294− go (JSApp j js) = JSApp (go (f j)) (map (go . f) js)
300+ go (JSApp j js) = JSApp <$> f' j <*> traverse f' js
295− go (JSConditional j1 j2 j3) = JSConditional (go (f j1)) (go (f j2)) (go (f j3))
301+ go (JSConditional j1 j2 j3) = JSConditional <$> f' j1 <*> f' j2 <*> f' j3
296− go (JSBlock js) = JSBlock (map (go . f) js)
302+ go (JSBlock js) = JSBlock <$> traverse f' js
297− go (JSVariableIntroduction name j) = JSVariableIntroduction name (fmap (go . f) j)
303+ go (JSVariableIntroduction name j) = JSVariableIntroduction name <$> traverse f' j
298− go (JSAssignment j1 j2) = JSAssignment (go (f j1)) (go (f j2))
304+ go (JSAssignment j1 j2) = JSAssignment <$> f' j1 <*> f' j2
299− go (JSWhile j1 j2) = JSWhile (go (f j1)) (go (f j2))
305+ go (JSWhile j1 j2) = JSWhile <$> f' j1 <*> f' j2
300− go (JSFor name j1 j2 j3) = JSFor name (go (f j1)) (go (f j2)) (go (f j3))
306+ go (JSFor name j1 j2 j3) = JSFor name <$> f' j1 <*> f' j2 <*> f' j3
301− go (JSForIn name j1 j2) = JSForIn name (go (f j1)) (go (f j2))
307+ go (JSForIn name j1 j2) = JSForIn name <$> f' j1 <*> f' j2
302− go (JSIfElse j1 j2 j3) = JSIfElse (go (f j1)) (go (f j2)) (fmap (go . f) j3)
308+ go (JSIfElse j1 j2 j3) = JSIfElse <$> f' j1 <*> f' j2 <*> traverse f' j3
303− go (JSReturn j) = JSReturn (go (f j))
309+ go (JSReturn j) = JSReturn <$> f' j
304− go (JSThrow j) = JSThrow (go (f j))
310+ go (JSThrow j) = JSThrow <$> f' j
305− go (JSTypeOf j) = JSTypeOf (go (f j))
311+ go (JSTypeOf j) = JSTypeOf <$> f' j
306− go (JSLabel name j) = JSLabel name (go (f j))
312+ go (JSLabel name j) = JSLabel name <$> f' j
307− go (JSInstanceOf j1 j2) = JSInstanceOf (go (f j1)) (go (f j2))
313+ go (JSInstanceOf j1 j2) = JSInstanceOf <$> f' j1 <*> f' j2
308− go (JSComment com j) = JSComment com (go (f j))
314+ go (JSComment com j) = JSComment com <$> f' j
309 go other = f other
315 go other = f other
311everythingOnJS :: (r -> r -> r) -> (JS -> r) -> JS -> r
317everythingOnJS :: (r -> r -> r) -> (JS -> r) -> JS -> r