Skip to content

[ refactor ] ScopedSnocList: WIP #3368

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 68 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
2b660ce
[ ci, tmp ] Run tests in quick check
GulinSS Feb 21, 2025
cd2243a
[ libs, tmp ] Add 1 minute timeout in Golden
GulinSS Feb 21, 2025
0cb1268
LOG: Structural logging
GulinSS Dec 17, 2024
32313c4
LOG: Structural logging depth applied
GulinSS Dec 17, 2024
6eb2ce3
LOG: Reduce log output for log output
GulinSS Jan 16, 2025
621fe50
LOG: Enable/disable tree-like logging output (to prevent golden tests…
GulinSS Feb 20, 2025
50b298a
LOG: Fix tests
GulinSS Feb 21, 2025
511bfaa
LOG: Fix grammatics for logQuiet
GulinSS Feb 21, 2025
526453c
ScopedSnocList: Semi-Automatic code modifications with code injection…
GulinSS Aug 5, 2024
9802ddf
ScopedSnocList: add `Show` to `SubstCEnv`
GulinSS Nov 29, 2024
044b89d
ScopedSnocList: Trivial logging
GulinSS Oct 31, 2024
19d0525
ScopedSnocList: Trivial reversal logging
GulinSS Nov 27, 2024
53c67a3
ScopedSnocList: Disable too noisy logs
GulinSS Dec 13, 2024
e65b89e
ScopedSnocList: More logging (+ reverse)
GulinSS Jan 16, 2025
ac2429a
ScopedSnocList: Restore logging sequence
GulinSS Oct 31, 2024
20178b8
ScopedSnocList: Reverse tooling for LocalEnv
GulinSS Nov 7, 2024
7212557
ScopedSnocList: Reverse tooling for Var
GulinSS Nov 7, 2024
2598eee
ScopedSnocList: Reverse tooling `Inline` and `CompileExpr`
GulinSS Jan 16, 2025
0462e71
ScopedSnocList: Use `implicitsAs` with reversed list of variables
GulinSS Nov 7, 2024
4823475
ScopedSnocList: Fix reversed order of arguments in `getArgTys` NF sub…
GulinSS Nov 8, 2024
83ef79c
ScopedSnocList: Use `substName` from Allais (do not know why)
GulinSS Nov 16, 2024
f238284
ScopedSnocList: Use `weakenNs` instead of `addLater` from Allais (do …
GulinSS Nov 16, 2024
acce47e
ScopedSnocList: Yaffle uses `normalizeLHS` instead of `normalizeHoles…
GulinSS Nov 16, 2024
199605e
ScopedSnocList: Correct order of `var`s for `patCompile` and `mkPatCl…
GulinSS Nov 19, 2024
f64d368
ScopedSnocList: Make `XX`, `YY` at `{arg:XX}` and `{e:YY}` follow ori…
GulinSS Nov 22, 2024
7227fb5
ScopedSnocList: Useful comments
GulinSS Dec 5, 2024
bdfb568
ScopedSnocList: Ported mkSub from Yaffle
GulinSS Dec 5, 2024
6f3e0d7
ScopedSnocList: WIP: Use `List` of `args` at `ConCase` and its childr…
GulinSS Dec 3, 2024
239805e
ScopedSnocList: Use `List` of `args` at `ConCase` and its children (i…
GulinSS Dec 3, 2024
2d9de0d
ScopedSnocList: Correct order of `NTCon` for `findPos` and `checkConc…
GulinSS Dec 10, 2024
6e0e4ad
ScopedSnocList: Fix constant fold
GulinSS Dec 20, 2024
eae5d02
ScopedSnocList: Correct behavior for `getPMDef`
GulinSS Jan 17, 2025
c4ce87c
ScopedSnocList: Fix hanging on interface implementation inlining
GulinSS Jan 24, 2025
2632902
ScopedSnocList: Correct `unifyInvertible` reverse positions
GulinSS Jan 24, 2025
b6d0efe
ScopedSnocList: `convGen` expects to deal with reverse processing of …
GulinSS Jan 24, 2025
52c11f6
ScopedSnocList: Fix `concrete`
GulinSS Jan 24, 2025
f971a08
ScopedSnocList: Fix correct order of `NTCon`/`NDCon` for reify and elab
GulinSS Jan 29, 2025
f8055a7
ScopedSnocList: Fix `dropPos` at `eraseApps`
GulinSS Jan 30, 2025
cb0ff0d
ScopedSnocList: Trivial logging
GulinSS Jan 30, 2025
b068592
ScopedSnocList: Useful comments
GulinSS Jan 30, 2025
c107ad1
ScopedSnocList: Trivial reversal logging
GulinSS Jan 30, 2025
7aecf17
ScopedSnocList: Fix CI
GulinSS Jan 30, 2025
18a7de8
ScopedSnocList: remove useless logs
GulinSS Feb 7, 2025
9cfca41
ScopedSnocList: Preventing too deep evaluation at `getArgTys`
GulinSS Feb 7, 2025
26772b0
ScopedSnocList: !!! Revert wrong changes to make trivial IO works
GulinSS Feb 13, 2025
c4f7abc
ScopedSnocList: Fix `IO` `>>`
GulinSS Feb 17, 2025
d66cbcb
ScopedSnocList: Correct log order for `CDef` args
GulinSS Feb 20, 2025
38fea37
ScopedSnocList: `mergeLambdas` remove reversal order due of already r…
GulinSS Feb 20, 2025
7997632
ScopedSnocList: Fix declare in elabScript and `Reify IClaimData`
spcfox Feb 20, 2025
3c7ad5c
ScopedSnocList: Fix grammatics for logQuiet
GulinSS Feb 21, 2025
052b2e5
ScopedSnocList: Update tests to match new expected output (due of sho…
GulinSS Feb 21, 2025
5ec8fcc
ScopedSnocList: Recalculate argpos in `case` unelaboration
spcfox Feb 21, 2025
00d2efe
ScopedSnocList: Recalculate `scrutinee` idx at `chkConvCaseBlock`
GulinSS Feb 26, 2025
d2b904c
ScopedSnocList: Fix pattern matching on arrow types
spcfox Feb 21, 2025
99269cb
ScopedSnocList: Adapt expected
GulinSS Feb 22, 2025
a48c0cf
ScopedSnocList: Fix `canInlineCaseBlock`
GulinSS Feb 26, 2025
c4c0497
ScopedSnocList: Use `Weaken` from Yaffle + fix `snocIdx` + remove dup…
GulinSS Feb 26, 2025
68914ba
ScopedSnocList: Fix `refc/*` tests
GulinSS Feb 28, 2025
ee443dd
ScopedSnocList: Fix proof search in pairs
spcfox Mar 2, 2025
f0fc6da
ScopedSnocList: Fix identity optimization
spcfox Mar 2, 2025
ed46bff
ScopedSnocList: Fix case builder when `argTys` shorter then `args`
spcfox Mar 4, 2025
d9515b5
ScopedSnocList: Add cast localVars to `List` in `RunElab`
spcfox Mar 4, 2025
19a3387
ScopedSnocList: Specify `revOnto` module and move `revOnto` into `Lib…
spcfox Mar 4, 2025
5356938
ScopedSnocList: Reverse local vars in elaboration script
spcfox Mar 5, 2025
dc1a04d
ScopedSnocList: Fix order of arguments in external functions
spcfox Mar 5, 2025
4a98b42
ScopedSnocList: Trivial logging tools
GulinSS Mar 7, 2025
0a3ca35
ScopedSnocList: Compile body fixes for `SchemeEval`
GulinSS Mar 7, 2025
7a116ca
ScopedSnocList: Cleanup and refactor
spcfox Mar 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci-idris2-and-libs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ jobs:
- name: Build current version
run: |
make && make install
- name: Test
run: make ci-ubuntu-test INTERACTIVE=''
- name: Artifact Idris2 from previous version
uses: actions/upload-artifact@v4
with:
Expand Down
2 changes: 2 additions & 0 deletions idris2api.ipkg
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ modules =
Core.LinearCheck,
Core.Metadata,
Core.Name,
Core.Name.CompatibleVars,
Core.Name.Namespace,
Core.Name.Scoped,
Core.Normalise,
Expand Down Expand Up @@ -191,6 +192,7 @@ modules =
Libraries.Data.NameMap.Traversable,
Libraries.Data.Ordering.Extra,
Libraries.Data.PosMap,
Libraries.Data.SnocList.Extra,
Libraries.Data.SnocList.HasLength,
Libraries.Data.SnocList.LengthMatch,
Libraries.Data.SnocList.SizeOf,
Expand Down
10 changes: 10 additions & 0 deletions libs/base/Data/SnocList.idr
Original file line number Diff line number Diff line change
Expand Up @@ -471,3 +471,13 @@ tailRecAppendIsAppend : (sx, sy : SnocList a) -> tailRecAppend sx sy = sx ++ sy
tailRecAppendIsAppend sx Lin = Refl
tailRecAppendIsAppend sx (sy :< y) =
trans (snocTailRecAppend y sx sy) (cong (:< y) $ tailRecAppendIsAppend sx sy)

||| `reverseOnto` reverses the snoc list and prepends it to the "onto" argument
export
revOnto : (xs, vs : SnocList a) -> reverseOnto xs vs = xs ++ reverse vs
revOnto _ [<] = Refl
revOnto xs (vs :< v) =
do rewrite revOnto (xs :< v) vs
rewrite sym $ appendAssociative xs [<v] (reverse vs)
rewrite revOnto [<v] vs
Refl
6 changes: 3 additions & 3 deletions libs/base/Data/SnocList/HasLength.idr
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ map f Z = Z
map f (S hl) = S (map f hl)

export
sucL : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
sucL Z = S Z
sucL (S n) = S (sucL n)
sucR : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
sucR Z = S Z
sucR (S n) = S (sucR n)

export
hlAppend : HasLength m sx -> HasLength n sy -> HasLength (n + m) (sx ++ sy)
Expand Down
11 changes: 11 additions & 0 deletions libs/base/Data/SnocList/Operations.idr
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,17 @@ lengthHomomorphism sx (sy :< x) = Calc $
~~ 1 + (length sx + length sy) ...(cong (1+) $ lengthHomomorphism _ _)
~~ length sx + (1 + length sy) ...(plusSuccRightSucc _ _)

export
lengthDistributesOverFish : (sx : SnocList a) -> (ys : List a) ->
length (sx <>< ys) === length sx + length ys
lengthDistributesOverFish sx [] = sym $ plusZeroRightNeutral _
lengthDistributesOverFish sx (y :: ys) = Calc $
|~ length ((sx :< y) <>< ys)
~~ length (sx :< y) + length ys ...( lengthDistributesOverFish (sx :< y) ys)
~~ S (length sx) + length ys ...( Refl )
~~ length sx + S (length ys) ...( plusSuccRightSucc _ _ )
~~ length sx + length (y :: ys) ...( Refl )

-- cons-list operations on snoc-lists

||| Take `n` first elements from `sx`, returning the whole list if
Expand Down
2 changes: 1 addition & 1 deletion libs/test/Test/Golden.idr
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ runTest opts testPath = do
let cg = maybe "" (" --cg " ++) (codegen opts)
let exe = "\"" ++ exeUnderTest opts ++ cg ++ "\""
ignore $ system $ "cd " ++ escapeArg testPath ++ " && " ++
"sh ./run " ++ exe ++ " | tr -d '\\r' > output"
"timeout 1m sh ./run " ++ exe ++ " | tr -d '\\r' > output"
end <- clockTime UTC

Right out <- readFile $ testPath ++ "/output"
Expand Down
64 changes: 32 additions & 32 deletions src/Compiler/ANF.idr
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ import Compiler.LambdaLift

import Core.CompileExpr
import Core.Context
import Core.Context.Log
import Core.Core
import Core.TT

import Data.List
import Data.SnocList
import Data.Vect
import Libraries.Data.SortedSet
import Libraries.Data.SnocList.Extra

%default covering

Expand Down Expand Up @@ -136,9 +139,9 @@ Show ANFDef where
show args ++ " -> " ++ show ret
show (MkAError exp) = "Error: " ++ show exp

data AVars : List Name -> Type where
Nil : AVars []
(::) : Int -> AVars xs -> AVars (x :: xs)
data AVars : SnocList Name -> Type where
Lin : AVars [<]
(:<) : AVars xs -> Int -> AVars (xs :< x)

data Next : Type where

Expand All @@ -150,8 +153,8 @@ nextVar
pure i

lookup : {idx : _} -> (0 p : IsVar x idx vs) -> AVars vs -> Int
lookup First (x :: xs) = x
lookup (Later p) (x :: xs) = lookup p xs
lookup First (xs :< x) = x
lookup (Later p) (xs :< x) = lookup p xs

bindArgs : {auto v : Ref Next Int} ->
List ANF -> Core (List (AVar, Maybe ANF))
Expand Down Expand Up @@ -187,6 +190,15 @@ mlet fc val sc
= do i <- nextVar
pure $ ALet fc i val (sc (ALocal i))

bindAsFresh :
{auto v : Ref Next Int} ->
(args : List Name) -> AVars vars' ->
Core (List Int, AVars (vars' <>< args))
bindAsFresh [] vs = pure ([], vs)
bindAsFresh (n :: ns) vs
= do i <- nextVar
mapFst (i ::) <$> bindAsFresh ns (vs :< i)

mutual
anfArgs : {vars : _} ->
{auto v : Ref Next Int} ->
Expand All @@ -203,15 +215,16 @@ mutual
anf vs (LAppName fc lazy n args)
= anfArgs fc vs args (AAppName fc lazy n)
anf vs (LUnderApp fc n m args)
= anfArgs fc vs args (AUnderApp fc n m)
-- = anfArgs fc vs (reverse args) (AUnderApp fc n m)
= anfArgs fc vs args (AUnderApp fc n m)
anf vs (LApp fc lazy f a)
= anfArgs fc vs [f, a] $
\case
[fvar, avar] => AApp fc lazy fvar avar
_ => ACrash fc "Can't happen (AApp)"
anf vs (LLet fc x val sc)
= do i <- nextVar
let vs' = i :: vs
let vs' = vs :< i
pure $ ALet fc i !(anf vs val) !(anf vs' sc)
anf vs (LCon fc n ci t args)
= anfArgs fc vs args (ACon fc n ci t)
Expand Down Expand Up @@ -241,16 +254,8 @@ mutual
{auto v : Ref Next Int} ->
AVars vars -> LiftedConAlt vars -> Core AConAlt
anfConAlt vs (MkLConAlt n ci t args sc)
= do (is, vs') <- bindArgs args vs
= do (is, vs') <- bindAsFresh args vs
pure $ MkAConAlt n ci t is !(anf vs' sc)
where
bindArgs : (args : List Name) -> AVars vars' ->
Core (List Int, AVars (args ++ vars'))
bindArgs [] vs = pure ([], vs)
bindArgs (n :: ns) vs
= do i <- nextVar
(is, vs') <- bindArgs ns vs
pure (i :: is, i :: vs')

anfConstAlt : {vars : _} ->
{auto v : Ref Next Int} ->
Expand All @@ -259,28 +264,23 @@ mutual
= pure $ MkAConstAlt c !(anf vs sc)

export
toANF : LiftedDef -> Core ANFDef
toANF : {auto c : Ref Ctxt Defs} -> LiftedDef -> Core ANFDef
toANF (MkLFun args scope sc)
= do v <- newRef Next (the Int 0)
(iargs, vsNil) <- bindArgs args []
let vs : AVars args = rewrite sym (appendNilRightNeutral args) in
vsNil
(iargs', vs) <- bindArgs scope vs
pure $ MkAFun (iargs ++ reverse iargs') !(anf vs sc)
where
bindArgs : {auto v : Ref Next Int} ->
(args : List Name) -> AVars vars' ->
Core (List Int, AVars (args ++ vars'))
bindArgs [] vs = pure ([], vs)
bindArgs (n :: ns) vs
= do i <- nextVar
(is, vs') <- bindArgs ns vs
pure (i :: is, i :: vs')
log "compile.execute" 40 $ "toANF args: \{show $ toList args}, scope: \{show $ asList scope}, lifted: \{show sc}"
(iargs, vsNil) <- bindAsFresh (cast args) [<]
let vs : AVars args
:= rewrite sym $ appendLinLeftNeutral args in
rewrite snocAppendAsFish [<] args in vsNil
(iargs', vs) <- bindAsFresh (cast scope) vs
sc' <- anf (rewrite snocAppendAsFish args scope in vs) sc
log "compile.execute" 40 $ "toANF iargs: \{show iargs}, iargs': \{show iargs'}, lifted: \{show sc'}"
pure $ MkAFun (iargs ++ iargs') sc'
toANF (MkLCon t a ns) = pure $ MkACon t a ns
toANF (MkLForeign ccs fargs t) = pure $ MkAForeign ccs fargs t
toANF (MkLError err)
= do v <- newRef Next (the Int 0)
pure $ MkAError !(anf [] err)
pure $ MkAError !(anf [<] err)

export
freeVariables : ANF -> SortedSet AVar
Expand Down
68 changes: 37 additions & 31 deletions src/Compiler/CaseOpts.idr
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@ import Core.FC
import Core.TT

import Data.List
import Data.SnocList
import Data.Vect

import Libraries.Data.List.SizeOf
import Libraries.Data.SnocList.SizeOf
import Libraries.Data.SnocList.Extra

%default covering

{-
Expand All @@ -32,38 +37,39 @@ case t of

shiftUnder : {args : _} ->
{idx : _} ->
(0 p : IsVar n idx (x :: args ++ vars)) ->
NVar n (args ++ x :: vars)
(0 p : IsVar n idx (vars ++ args :< x)) ->
NVar n (vars :< x ++ args)
shiftUnder First = weakenNVar (mkSizeOf args) (MkNVar First)
shiftUnder (Later p) = insertNVar (mkSizeOf args) (MkNVar p)

shiftVar : {outer, args : Scope} ->
NVar n (outer ++ (x :: args ++ vars)) ->
NVar n (outer ++ (args ++ x :: vars))
shiftVar : {outer : Scope} -> {args : List Name} ->
NVar n ((vars <>< args :< x) ++ outer) ->
NVar n ((vars :< x <>< args) ++ outer)
shiftVar nvar
= let out = mkSizeOf outer in
-- TODO: G.Allois version has Left/Right swap
case locateNVar out nvar of
Left nvar => embed nvar
Right (MkNVar p) => weakenNs out (shiftUnder p)
Right (MkNVar p) => weakenNs out (shiftUndersN (mkSizeOf _) p)

mutual
renameVar : IsVar x i ((vars :< old <>< args) ++ local) ->
IsVar x i ((vars :< new <>< args) ++ local)
renameVar = believe_me -- it's the same index, so just the identity at run time

shiftBinder : {outer, args : _} ->
(new : Name) ->
CExp (outer ++ old :: (args ++ vars)) ->
CExp (outer ++ (args ++ new :: vars))
CExp (((vars <>< args) :< old) ++ outer) ->
CExp ((vars :< new <>< args) ++ outer)
shiftBinder new (CLocal fc p)
= case shiftVar (MkNVar p) of
MkNVar p' => CLocal fc (renameVar p')
where
renameVar : IsVar x i (outer ++ (args ++ (old :: rest))) ->
IsVar x i (outer ++ (args ++ (new :: rest)))
renameVar = believe_me -- it's the same index, so just the identity at run time
shiftBinder new (CRef fc n) = CRef fc n
shiftBinder {outer} new (CLam fc n sc)
= CLam fc n $ shiftBinder {outer = n :: outer} new sc
= CLam fc n $ shiftBinder {outer = outer :< n} new sc
shiftBinder new (CLet fc n inlineOK val sc)
= CLet fc n inlineOK (shiftBinder new val)
$ shiftBinder {outer = n :: outer} new sc
$ shiftBinder {outer = outer :< n} new sc
shiftBinder new (CApp fc f args)
= CApp fc (shiftBinder new f) $ map (shiftBinder new) args
shiftBinder new (CCon fc ci c tag args)
Expand All @@ -85,36 +91,36 @@ mutual
shiftBinder new (CErased fc) = CErased fc
shiftBinder new (CCrash fc msg) = CCrash fc msg

shiftBinderConAlt : {outer, args : _} ->
shiftBinderConAlt : {outer : _} -> {args : _} ->
(new : Name) ->
CConAlt (outer ++ (x :: args ++ vars)) ->
CConAlt (outer ++ (args ++ new :: vars))
CConAlt (((vars <>< args) :< old) ++ outer) ->
CConAlt ((vars :< new <>< args) ++ outer)
shiftBinderConAlt new (MkConAlt n ci t args' sc)
= let sc' : CExp ((args' ++ outer) ++ (x :: args ++ vars))
= rewrite sym (appendAssociative args' outer (x :: args ++ vars)) in sc in
= let sc' : CExp (((vars <>< args) :< old) ++ (outer <>< args'))
= rewrite sym $ snocAppendFishAssociative (vars <>< args :< old) outer args' in sc in
MkConAlt n ci t args' $
rewrite (appendAssociative args' outer (args ++ new :: vars))
in shiftBinder new {outer = args' ++ outer} sc'
rewrite snocAppendFishAssociative (vars :< new <>< args) outer args'
in shiftBinder new {outer = outer <>< args'} sc'

shiftBinderConstAlt : {outer, args : _} ->
(new : Name) ->
CConstAlt (outer ++ (x :: args ++ vars)) ->
CConstAlt (outer ++ (args ++ new :: vars))
CConstAlt (((vars <>< args) :< old) ++ outer) ->
CConstAlt ((vars :< new <>< args) ++ outer)
shiftBinderConstAlt new (MkConstAlt c sc) = MkConstAlt c $ shiftBinder new sc

-- If there's a lambda inside a case, move the variable so that it's bound
-- outside the case block so that we can bind it just once outside the block
liftOutLambda : {args : _} ->
(new : Name) ->
CExp (old :: args ++ vars) ->
CExp (args ++ new :: vars)
liftOutLambda = shiftBinder {outer = []}
CExp (vars <>< args :< old) ->
CExp (vars :< new <>< args)
liftOutLambda = shiftBinder {outer = [<]}

-- If all the alternatives start with a lambda, we can have a single lambda
-- binding outside
tryLiftOut : (new : Name) ->
List (CConAlt vars) ->
Maybe (List (CConAlt (new :: vars)))
Maybe (List (CConAlt (vars :< new)))
tryLiftOut new [] = Just []
tryLiftOut new (MkConAlt n ci t args (CLam fc x sc) :: as)
= do as' <- tryLiftOut new as
Expand All @@ -124,7 +130,7 @@ tryLiftOut _ _ = Nothing

tryLiftOutConst : (new : Name) ->
List (CConstAlt vars) ->
Maybe (List (CConstAlt (new :: vars)))
Maybe (List (CConstAlt (vars :< new)))
tryLiftOutConst new [] = Just []
tryLiftOutConst new (MkConstAlt c (CLam fc x sc) :: as)
= do as' <- tryLiftOutConst new as
Expand All @@ -134,7 +140,7 @@ tryLiftOutConst _ _ = Nothing

tryLiftDef : (new : Name) ->
Maybe (CExp vars) ->
Maybe (Maybe (CExp (new :: vars)))
Maybe (Maybe (CExp (vars :< new)))
tryLiftDef new Nothing = Just Nothing
tryLiftDef new (Just (CLam fc x sc))
= let sc' = liftOutLambda {args = []} new sc in
Expand Down Expand Up @@ -313,8 +319,8 @@ doCaseOfCase fc x xalts xdef alts def
updateAlt (MkConAlt n ci t args sc)
= MkConAlt n ci t args $
CConCase fc sc
(map (weakenNs (mkSizeOf args)) alts)
(map (weakenNs (mkSizeOf args)) def)
(map (weakensN (mkSizeOf args)) alts)
(map (weakensN (mkSizeOf args)) def)

updateDef : CExp vars -> CExp vars
updateDef sc = CConCase fc sc alts def
Expand Down
Loading