on 6f75310 help sign in
elk/compiler/Transform/Expression.hs
31 lines 1.4 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Transform.Expression where
4import Control.Applicative ((<$>),(<*>))
5import SourceSyntax.Expression
6import SourceSyntax.Location
8crawl :: ([def] -> Either a [def']) -> (LExpr' def) -> Either a (LExpr' def')
9crawl transform = go
10 where
11 go (L srcSpan expr) =
12 L srcSpan <$>
13 case expr of
14 Var x -> return (Var x)
15 Lambda p e -> Lambda p <$> go e
16 Binop op e1 e2 -> Binop op <$> go e1 <*> go e2
17 Case e cases -> Case <$> go e <*> mapM (\(p,b) -> (,) p <$> go b) cases
18 Data name es -> Data name <$> mapM go es
19 Literal lit -> return (Literal lit)
20 Range e1 e2 -> Range <$> go e1 <*> go e2
21 ExplicitList es -> ExplicitList <$> mapM go es
22 App e1 e2 -> App <$> go e1 <*> go e2
23 MultiIf branches -> MultiIf <$> mapM (\(b,e) -> (,) <$> go b <*> go e) branches
24 Access e lbl -> Access <$> go e <*> return lbl
25 Remove e lbl -> Remove <$> go e <*> return lbl
26 Insert e lbl v -> Insert <$> go e <*> return lbl <*> go v
27 Modify e fields -> Modify <$> go e <*> mapM (\(k,v) -> (,) k <$> go v) fields
28 Record fields -> Record <$> mapM (\(k,v) -> (,) k <$> go v) fields
29 Markdown uid md es -> Markdown uid md <$> mapM go es
30 Let defs body -> Let <$> transform defs <*> go body