@@ -37,38 +37,38 @@ case t of
37
37
38
38
shiftUnder : {args : _} ->
39
39
{idx : _} ->
40
- (0 p : IsVar n idx (x :: args ++ vars )) ->
41
- NVar n (args ++ x :: vars )
40
+ (0 p : IsVar n idx (vars ++ args :< x )) ->
41
+ NVar n (vars :< x ++ args )
42
42
shiftUnder First = weakenNVar (mkSizeOf args) (MkNVar First )
43
43
shiftUnder (Later p) = insertNVar (mkSizeOf args) (MkNVar p)
44
44
45
45
shiftVar : {outer : Scope} -> {args : List Name} ->
46
- NVar n (outer ++ (x :: args ++ vars) ) ->
47
- NVar n (outer ++ (args ++ x :: vars) )
46
+ NVar n ((vars <>< args :< x) ++ outer ) ->
47
+ NVar n (( vars :< x <>< args) ++ outer )
48
48
shiftVar nvar
49
49
= let out = mkSizeOf outer in
50
50
case locateNVar out nvar of
51
51
Left nvar => embed nvar
52
- Right (MkNVar p) => weakenNs out (shiftUnder p)
52
+ Right (MkNVar p) => weakenNs out (shiftUndersN (mkSizeOf _ ) p)
53
53
54
54
mutual
55
+ renameVar : IsVar x i ((vars :< old <>< args) ++ local) ->
56
+ IsVar x i ((vars :< new <>< args) ++ local)
57
+ renameVar = believe_me -- it's the same index, so just the identity at run time
58
+
55
59
shiftBinder : {outer, args : _ } ->
56
60
(new : Name) ->
57
- CExp (outer ++ old :: (args ++ vars) ) ->
58
- CExp (outer ++ (args ++ new :: vars) )
61
+ CExp (((vars <>< args) :< old) ++ outer ) ->
62
+ CExp (( vars :< new <>< args) ++ outer )
59
63
shiftBinder new (CLocal fc p)
60
64
= case shiftVar (MkNVar p) of
61
65
MkNVar p' => CLocal fc (renameVar p')
62
- where
63
- renameVar : IsVar x i (outer ++ (args ++ (old :: rest))) ->
64
- IsVar x i (outer ++ (args ++ (new :: rest)))
65
- renameVar = believe_me -- it's the same index, so just the identity at run time
66
66
shiftBinder new (CRef fc n) = CRef fc n
67
67
shiftBinder {outer} new (CLam fc n sc)
68
- = CLam fc n $ shiftBinder {outer = n :: outer } new sc
68
+ = CLam fc n $ shiftBinder {outer = outer : < n } new sc
69
69
shiftBinder new (CLet fc n inlineOK val sc)
70
70
= CLet fc n inlineOK (shiftBinder new val)
71
- $ shiftBinder {outer = n :: outer } new sc
71
+ $ shiftBinder {outer = outer : < n } new sc
72
72
shiftBinder new (CApp fc f args)
73
73
= CApp fc (shiftBinder new f) $ map (shiftBinder new) args
74
74
shiftBinder new (CCon fc ci c tag args)
@@ -92,34 +92,34 @@ mutual
92
92
93
93
shiftBinderConAlt : {outer, args : _ } ->
94
94
(new : Name) ->
95
- CConAlt (outer ++ (x :: args ++ vars) ) ->
96
- CConAlt (outer ++ (args ++ new :: vars) )
95
+ CConAlt (((vars <>< args) :< old) ++ outer ) ->
96
+ CConAlt (( vars :< new <>< args) ++ outer )
97
97
shiftBinderConAlt new (MkConAlt n ci t args' sc)
98
- = let sc' : CExp ((args' ++ outer ) ++ (x :: args ++ vars ))
99
- = rewrite sym (appendAssociative args' outer (x :: args ++ vars)) in sc in
98
+ = let sc' : CExp (((vars <>< args) :< old ) ++ (outer <>< args' ))
99
+ = rewrite sym $ snocAppendFishAssociative (vars <>< args : < old) outer args' in sc in
100
100
MkConAlt n ci t args' $
101
- rewrite (appendAssociative args' outer (args ++ new :: vars))
102
- in shiftBinder new {outer = args' ++ outer } sc'
101
+ rewrite snocAppendFishAssociative ( vars : < new <>< args) outer args'
102
+ in shiftBinder new {outer = outer <>< args' } sc'
103
103
104
104
shiftBinderConstAlt : {outer, args : _ } ->
105
105
(new : Name) ->
106
- CConstAlt (outer ++ (x :: args ++ vars) ) ->
107
- CConstAlt (outer ++ (args ++ new :: vars) )
106
+ CConstAlt (((vars <>< args) :< old) ++ outer ) ->
107
+ CConstAlt (( vars :< new <>< args) ++ outer )
108
108
shiftBinderConstAlt new (MkConstAlt c sc) = MkConstAlt c $ shiftBinder new sc
109
109
110
110
-- If there's a lambda inside a case, move the variable so that it's bound
111
111
-- outside the case block so that we can bind it just once outside the block
112
112
liftOutLambda : {args : _} ->
113
113
(new : Name) ->
114
- CExp (old :: args ++ vars ) ->
115
- CExp (args ++ new :: vars )
114
+ CExp (vars <>< args :< old ) ->
115
+ CExp (vars :< new <>< args )
116
116
liftOutLambda = shiftBinder {outer = ScopeEmpty }
117
117
118
118
-- If all the alternatives start with a lambda, we can have a single lambda
119
119
-- binding outside
120
120
tryLiftOut : (new : Name) ->
121
121
List (CConAlt vars) ->
122
- Maybe (List (CConAlt (new :: vars )))
122
+ Maybe (List (CConAlt (vars :< new )))
123
123
tryLiftOut new [] = Just []
124
124
tryLiftOut new (MkConAlt n ci t args (CLam fc x sc) :: as)
125
125
= do as' <- tryLiftOut new as
@@ -129,7 +129,7 @@ tryLiftOut _ _ = Nothing
129
129
130
130
tryLiftOutConst : (new : Name) ->
131
131
List (CConstAlt vars) ->
132
- Maybe (List (CConstAlt (new :: vars )))
132
+ Maybe (List (CConstAlt (vars :< new )))
133
133
tryLiftOutConst new [] = Just []
134
134
tryLiftOutConst new (MkConstAlt c (CLam fc x sc) :: as)
135
135
= do as' <- tryLiftOutConst new as
@@ -139,7 +139,7 @@ tryLiftOutConst _ _ = Nothing
139
139
140
140
tryLiftDef : (new : Name) ->
141
141
Maybe (CExp vars) ->
142
- Maybe (Maybe (CExp (new :: vars )))
142
+ Maybe (Maybe (CExp (vars :< new )))
143
143
tryLiftDef new Nothing = Just Nothing
144
144
tryLiftDef new (Just (CLam fc x sc))
145
145
= let sc' = liftOutLambda {args = []} new sc in
@@ -318,8 +318,8 @@ doCaseOfCase fc x xalts xdef alts def
318
318
updateAlt (MkConAlt n ci t args sc)
319
319
= MkConAlt n ci t args $
320
320
CConCase fc sc
321
- (map (weakenNs (mkSizeOf args)) alts)
322
- (map (weakenNs (mkSizeOf args)) def)
321
+ (map (weakensN (mkSizeOf args)) alts)
322
+ (map (weakensN (mkSizeOf args)) def)
323
323
324
324
updateDef : CExp vars -> CExp vars
325
325
updateDef sc = CConCase fc sc alts def
0 commit comments