on cf3a0bd help sign in
elk/src/Transform/Expression.hs
84 lines 2.4 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Transform.Expression (crawlLet) where
4import Control.Applicative ((<$>),(<*>))
5import AST.Annotation ( Annotated(A) )
6import AST.Expression.General
9crawlLet
10 :: ([def] -> Either a [def'])
11 -> Expr ann def var
12 -> Either a (Expr ann def' var)
13crawlLet defsTransform annotatedExpression =
14 go annotatedExpression
15 where
16 go (A srcSpan expression) =
17 A srcSpan <$>
18 case expression of
19 Var x ->
20 return (Var x)
22 Lambda pattern body ->
23 Lambda pattern <$> go body
25 Binop op leftExpr rightExpr ->
26 Binop op <$> go leftExpr <*> go rightExpr
28 Case e cases ->
29 Case <$> go e <*> mapM (\(p,b) -> (,) p <$> go b) cases
31 Data name es ->
32 Data name <$> mapM go es
34 Literal lit ->
35 return (Literal lit)
37 Range lowExpr highExpr ->
38 Range <$> go lowExpr <*> go highExpr
40 ExplicitList expressions ->
41 ExplicitList <$> mapM go expressions
43 App funcExpr argExpr ->
44 App <$> go funcExpr <*> go argExpr
46 MultiIf branches ->
47 MultiIf <$> mapM (\(b,e) -> (,) <$> go b <*> go e) branches
49 Access record field ->
50 Access <$> go record <*> return field
52 Remove record field ->
53 Remove <$> go record <*> return field
55 Insert record field expr ->
56 Insert <$> go record <*> return field <*> go expr
58 Modify record fields ->
59 Modify
60 <$> go record
61 <*> mapM (\(field,expr) -> (,) field <$> go expr) fields
63 Record fields ->
64 Record <$> mapM (\(field,expr) -> (,) field <$> go expr) fields
66 Let defs body ->
67 Let <$> defsTransform defs <*> go body
69 GLShader uid src gltipe ->
70 return $ GLShader uid src gltipe
72 Port impl ->
73 Port <$>
74 case impl of
75 In name tipe ->
76 return (In name tipe)
78 Out name expr tipe ->
79 do expr' <- go expr
80 return (Out name expr' tipe)
82 Task name expr tipe ->
83 do expr' <- go expr
84 return (Task name expr' tipe)