@@ -6,39 +6,52 @@ import Idris.AbsSyntax
66import Core.CaseTree
77import Core.TT
88
9+data TTOpt = TermTrans (TT Name -> TT Name) -- term transform
10+ | CaseTrans (SC -> SC) -- case expression transform
11+
912class Transform a where
10− transform :: (a -> a) -> a -> a
13+ transform :: TTOpt -> a -> a
1114
1215instance Transform (TT Name) where
13− transform t x = t (trans' x) where
14− trans' (Bind n b sc) = Bind n (fmap (transform t) b) (transform t sc)
15− trans' (App f a) = App (transform t f) (transform t a)
16− trans' x = x
17−
18−type TTOpt = TT Name -> TT Name
16+ transform o@(TermTrans t) tm = trans t tm where
17+ trans t (Bind n b tm) = t $ Bind n (transform o b) (trans t tm)
18+ trans t (App f a) = t $ App (trans t f) (trans t a)
19+ trans t tm = t tm
20+ transform _ tm = tm
1921
20−optimisations :: [TTOpt]
21−optimisations = [zero, suc]
22+instance Transform a => Transform (Binder a) where
23+ transform t (Let ty v) = Let (transform t ty) (transform t v)
24+ transform t b = b { binderTy = transform t (binderTy b) }
2225
2326instance Transform SC where
24− transform t x = t (trans' x) where
25− trans' (Case n alts) = Case n (map transAlt alts)
26− trans' t = t
27−
28− transAlt (ConCase n i as sc) = ConCase n i as (trans' sc)
29− transAlt (ConstCase c sc) = ConstCase c (trans' sc)
30− transAlt (DefaultCase sc) = DefaultCase (trans' sc)
31−
32−type CaseOpt = SC -> SC
33−
34−zero :: TTOpt
35−zero (P _ n _) | n == NS (UN "O") ["nat","prelude"]
27+ transform o@(CaseTrans t) sc = trans t sc where
28+ trans t (Case n alts) = t (Case n (map (transform o) alts))
29+ trans t x = t x
30+ transform o@(TermTrans t) sc = trans t sc where
31+ trans t (Case n alts) = Case n (map (transform o) alts)
32+ trans t (STerm tm) = STerm (t tm)
33+ trans t x = x
34+
35+instance Transform CaseAlt where
36+ transform o (ConCase n i ns sc) = ConCase n i ns (transform o sc)
37+ transform o (ConstCase c sc) = ConstCase c (transform o sc)
38+ transform o (DefaultCase sc) = DefaultCase (transform o sc)
39+
40+natTrans = [TermTrans zero, TermTrans suc, CaseTrans natcase]
41+
42+zname = NS (UN "O") ["nat","prelude"]
43+sname = NS (UN "S") ["nat","prelude"]
44+
45+zero :: TT Name -> TT Name
46+zero (P _ n _) | n == zname
3647 = Constant (BI 0)
3748zero x = x
3849
39−suc :: TTOpt
40−suc (App (P _ s _) a) | s == NS (UN "S") ["nat","prelude"]
50+suc :: TT Name -> TT Name
51+suc (App (P _ s _) a) | s == sname
4152 = mkApp (P Ref (UN "prim__addBigInt") Erased) [Constant (BI 1), a]
4253suc x = x
4354
55+natcase :: SC -> SC
56+natcase = undefined
4457