Skip to content

Commit 3209ec2

Browse files
committed
[ refactor ] Use list of vars instead of names
1 parent 030b6e4 commit 3209ec2

File tree

2 files changed

+48
-33
lines changed

2 files changed

+48
-33
lines changed

src/Core/Case/CaseBuilder.idr

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,55 +1232,66 @@ findExtraDefaults fc defs (Case idx el ty altsIn)
12321232

12331233
findExtraDefaults fc defs ctree = pure []
12341234

1235-
mkSubst : {vars : _} -> (args : List Name) ->
1235+
mkSubst : {vars : _} -> (args : List (Var vars)) ->
12361236
(0 _ : LengthMatch args dropped) -> Subst Var dropped vars
12371237
mkSubst [] NilMatch = []
1238-
mkSubst (x :: xs) (ConsMatch m)
1239-
= case isVar x vars of
1240-
Just prf => prf :: mkSubst xs m
1241-
Nothing => ?todo
1238+
mkSubst (x :: xs) (ConsMatch m) = x :: mkSubst xs m
12421239

1243-
data MatchResult : Type where
1244-
ConPat : Name -> (tag : Int) -> List Name -> MatchResult
1245-
DelayPat : (ty, arg : Name) -> MatchResult
1246-
ConstPat : Constant -> MatchResult
1240+
data MatchResult : Scoped where
1241+
ConPat : Name -> (tag : Int) -> List (Var vars) -> MatchResult vars
1242+
DelayPat : (ty, arg : Var vars) -> MatchResult vars
1243+
ConstPat : Constant -> MatchResult vars
12471244

1248-
Show MatchResult where
1245+
Show (MatchResult vars) where
12491246
show (ConPat n tag args) = "ConPat \{show n} \{show tag} \{show args}"
12501247
show (DelayPat ty arg) = "DelayPat \{show ty} \{show arg}"
12511248
show (ConstPat c) = "ConstPat \{show c}"
12521249

1253-
optimiseTree : {vars : _} -> List (Name, MatchResult) -> CaseTree vars -> CaseTree vars
1254-
1255-
optimiseAlt : {vars : _} -> List (Name, MatchResult) -> Name -> CaseAlt vars -> CaseAlt vars
1256-
optimiseAlt ps nm (ConCase n tag args sc)
1257-
= ConCase n tag args (optimiseTree ((nm, ConPat n tag args) :: ps) sc)
1258-
optimiseAlt ps nm (DelayCase ty arg sc)
1259-
= DelayCase ty arg (optimiseTree ((nm, DelayPat ty arg) :: ps) sc)
1260-
optimiseAlt ps nm (ConstCase c sc)
1261-
= ConstCase c (optimiseTree ((nm, ConstPat c) :: ps) sc)
1262-
optimiseAlt ps nm (DefaultCase sc) = DefaultCase (optimiseTree ps sc)
1263-
1264-
pickAlt : {vars : _} -> List (Name, MatchResult) -> MatchResult -> List (CaseAlt vars) -> Maybe (CaseTree vars)
1250+
Weaken MatchResult where
1251+
weakenNs s (ConPat n tag args) = ConPat n tag (weakenNs s <$> args)
1252+
weakenNs s (DelayPat ty arg) = DelayPat (weakenNs s ty) (weakenNs s arg)
1253+
weakenNs s (ConstPat c) = ConstPat c
1254+
1255+
optimiseTree : {vars : _} -> List (Var vars, MatchResult vars) -> CaseTree vars -> CaseTree vars
1256+
1257+
optimiseAlt : {vars : _} -> List (Var vars, MatchResult vars) -> Var vars -> CaseAlt vars -> CaseAlt vars
1258+
optimiseAlt ps v (ConCase n tag args sc)
1259+
= do let sz = mkSizeOf args
1260+
let v' = weakenNs sz v
1261+
let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
1262+
let args' = allVarsPrefix sz
1263+
ConCase n tag args (optimiseTree ((v', ConPat n tag args') :: ps') sc)
1264+
optimiseAlt ps v (DelayCase ty arg sc)
1265+
= do let sz = mkSizeOf [_, _]
1266+
let v' = weakenNs sz v
1267+
let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
1268+
DelayCase ty arg (optimiseTree ((v', DelayPat first (later first)) :: ps') sc)
1269+
optimiseAlt ps v (ConstCase c sc)
1270+
= ConstCase c (optimiseTree ((v, ConstPat c) :: ps) sc)
1271+
optimiseAlt ps v (DefaultCase sc) = DefaultCase (optimiseTree ps sc)
1272+
1273+
pickAlt : {vars : _} -> List (Var vars, MatchResult vars) ->
1274+
MatchResult vars -> List (CaseAlt vars) -> Maybe (CaseTree vars)
12651275
pickAlt _ _ [] = Nothing
12661276
pickAlt ps p@(ConPat n t args) (ConCase n' t' args' sc :: alts)
12671277
= if t == t' && n == n'
12681278
then checkLengthMatch args args' <&> \match => -- lengths should always match
12691279
optimiseTree ps $ substCaseTree zero (mkSizeOf _) (mkSubst args match) sc
12701280
else pickAlt ps p alts
12711281
pickAlt ps (DelayPat ty arg) (DelayCase ty' arg' sc :: alts)
1272-
= Just $ optimiseTree ps $ substCaseTree zero (mkSizeOf _) (mkSubst {dropped=[_, _]} [ty, arg] %search) sc
1282+
= do let subst : Subst Var [ty', arg'] vars = mkSubst [ty, arg] %search
1283+
Just (optimiseTree ps $ substCaseTree zero (mkSizeOf _) subst sc)
12731284
pickAlt ps p@(ConstPat c) (ConstCase c' sc :: alts)
12741285
= if c == c'
1275-
then Just $ optimiseTree ps sc
1286+
then Just (optimiseTree ps sc)
12761287
else pickAlt ps p alts
1277-
pickAlt ps _ (DefaultCase sc :: alts) = Just $ optimiseTree ps sc
1288+
pickAlt ps _ (DefaultCase sc :: alts) = Just (optimiseTree ps sc)
12781289
pickAlt ps p (_ :: alts) = pickAlt ps p alts
12791290

12801291
optimiseTree ps (Case idx el ty alts)
1281-
= do let name = nameAt el
1282-
fromMaybe (Case idx el ty (map (optimiseAlt ps name) alts)) $ do
1283-
p <- lookup name ps
1292+
= do let var = MkVar el
1293+
fromMaybe (Case idx el ty (map (optimiseAlt ps var) alts)) $ do
1294+
p <- lookup var ps
12841295
pickAlt ps p alts
12851296
optimiseTree _ tm = tm
12861297

src/Core/TT/Var.idr

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,18 @@ export
166166
mkVarChiply : SizeOf inner -> Var (inner <>> nm :: outer)
167167
mkVarChiply (MkSizeOf s p) = MkVar (mkIsVarChiply p)
168168

169+
export
170+
allVarsPrefix : SizeOf vars -> List (Var (vars ++ outer))
171+
allVarsPrefix = go [<] where
172+
go : SizeOf local -> SizeOf vs -> List (Var (local <>> vs ++ outer))
173+
go s (MkSizeOf Z Z) = []
174+
go s (MkSizeOf (S k) (S l)) = mkVarChiply s :: go (suc s) (MkSizeOf k l)
175+
169176
||| Generate all variables
170177
export
171178
allVars : (vars : Scope) -> List (Var vars)
172-
allVars = go [<] where
173-
174-
go : SizeOf local -> (vs : Scope) -> List (Var (local <>> vs))
175-
go s [] = []
176-
go s (v :: vs) = mkVarChiply s :: go (s :< v) vs
179+
allVars vars = rewrite sym (appendNilRightNeutral vars)
180+
in allVarsPrefix (mkSizeOf vars)
177181

178182
export
179183
Eq (Var xs) where

0 commit comments

Comments
 (0)