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