git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Add everywhereOnJSTopDownM

Allows replacing JS nodes with ones calculated monadically.

commit0258e1d49f57ecb117d4c33c3537fc7c74618eaa authorBrian McKenna <brian@brianmckenna.org> dateMon 20 Apr 2015, 22:51 (12 years ago) parentfa59cf1
1 file changed+29−24
src/Language/PureScript/CodeGen/JS/AST.hs+29−24
src/Language/PureScript/CodeGen/JS/AST.hs+29−24
@@ -17,6 +17,8 @@
1717
1818module Language.PureScript.CodeGen.JS.AST where
1919
20+import Control.Monad ((>=>))
21+import Control.Monad.Identity
2022import Data.Data
2123
2224import Language.PureScript.Comments
@@ -281,31 +283,34 @@ everywhereOnJS f = go
281283 go other = f other
282284
283285everywhereOnJSTopDown :: (JS -> JS) -> JS -> JS
284−everywhereOnJSTopDown f = go . f
286+everywhereOnJSTopDown f = runIdentity . everywhereOnJSTopDownM (Identity . f)
287+
288+everywhereOnJSTopDownM :: (Monad m) => (JS -> m JS) -> JS -> m JS
289+everywhereOnJSTopDownM f = f >=> go
285290 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))
291+ f' = f >=> go
292+ go (JSUnary op j) = JSUnary op <$> f' j
293+ go (JSBinary op j1 j2) = JSBinary op <$> f' j1 <*> f' j2
294+ go (JSArrayLiteral js) = JSArrayLiteral <$> traverse f' js
295+ go (JSIndexer j1 j2) = JSIndexer <$> f' j1 <*> f' j2
296+ go (JSObjectLiteral js) = JSObjectLiteral <$> traverse (traverse f') js
297+ go (JSAccessor prop j) = JSAccessor prop <$> f' j
298+ go (JSFunction name args j) = JSFunction name args <$> f' j
299+ go (JSApp j js) = JSApp <$> f' j <*> traverse f' js
300+ go (JSConditional j1 j2 j3) = JSConditional <$> f' j1 <*> f' j2 <*> f' j3
301+ go (JSBlock js) = JSBlock <$> traverse f' js
302+ go (JSVariableIntroduction name j) = JSVariableIntroduction name <$> traverse f' j
303+ go (JSAssignment j1 j2) = JSAssignment <$> f' j1 <*> f' j2
304+ go (JSWhile j1 j2) = JSWhile <$> f' j1 <*> f' j2
305+ go (JSFor name j1 j2 j3) = JSFor name <$> f' j1 <*> f' j2 <*> f' j3
306+ go (JSForIn name j1 j2) = JSForIn name <$> f' j1 <*> f' j2
307+ go (JSIfElse j1 j2 j3) = JSIfElse <$> f' j1 <*> f' j2 <*> traverse f' j3
308+ go (JSReturn j) = JSReturn <$> f' j
309+ go (JSThrow j) = JSThrow <$> f' j
310+ go (JSTypeOf j) = JSTypeOf <$> f' j
311+ go (JSLabel name j) = JSLabel name <$> f' j
312+ go (JSInstanceOf j1 j2) = JSInstanceOf <$> f' j1 <*> f' j2
313+ go (JSComment com j) = JSComment com <$> f' j
309314 go other = f other
310315
311316everythingOnJS :: (r -> r -> r) -> (JS -> r) -> JS -> r