@@ -171,20 +171,20 @@ impl<'arena> Telescope<'arena> {
171171pub struct Branches < ' arena , P > {
172172 local_exprs : SharedEnv < ArcValue < ' arena > > ,
173173 pattern_branches : & ' arena [ ( P , Term < ' arena > ) ] ,
174- default_expr : Option < & ' arena Term < ' arena > > ,
174+ default_branch : Option < ( Option < StringId > , & ' arena Term < ' arena > ) > ,
175175}
176176
177177impl < ' arena , P > Branches < ' arena , P > {
178178 /// Construct a single-level pattern match.
179179 pub fn new (
180180 local_exprs : SharedEnv < ArcValue < ' arena > > ,
181181 pattern_branches : & ' arena [ ( P , Term < ' arena > ) ] ,
182- default_expr : Option < & ' arena Term < ' arena > > ,
182+ default_branch : Option < ( Option < StringId > , & ' arena Term < ' arena > ) > ,
183183 ) -> Branches < ' arena , P > {
184184 Branches {
185185 local_exprs,
186186 pattern_branches,
187- default_expr ,
187+ default_branch ,
188188 }
189189 }
190190
@@ -199,7 +199,7 @@ pub type PatternBranch<'arena, P> = (P, ArcValue<'arena>);
199199#[ derive( Clone , Debug ) ]
200200pub enum SplitBranches < ' arena , P > {
201201 Branch ( PatternBranch < ' arena , P > , Branches < ' arena , P > ) ,
202- Default ( Closure < ' arena > ) ,
202+ Default ( Option < StringId > , Closure < ' arena > ) ,
203203 None ,
204204}
205205
@@ -487,10 +487,11 @@ impl<'arena, 'env> ElimEnv<'arena, 'env> {
487487 let mut context = self . eval_env ( & mut branches. local_exprs ) ;
488488 SplitBranches :: Branch ( ( * pattern, context. eval ( body_expr) ) , branches)
489489 }
490- None => match branches. default_expr {
491- Some ( default_expr) => {
492- SplitBranches :: Default ( Closure :: new ( branches. local_exprs , default_expr) )
493- }
490+ None => match branches. default_branch {
491+ Some ( ( default_name, default_expr) ) => SplitBranches :: Default (
492+ default_name,
493+ Closure :: new ( branches. local_exprs , default_expr) ,
494+ ) ,
494495 None => SplitBranches :: None ,
495496 } ,
496497 }
@@ -564,9 +565,11 @@ impl<'arena, 'env> ElimEnv<'arena, 'env> {
564565 }
565566 // Otherwise call default with `head_expr`
566567 let mut local_exprs = branches. local_exprs . clone ( ) ;
567- local_exprs. push ( head_expr) ;
568- match branches. default_expr {
569- Some ( default_expr) => self . eval_env ( & mut local_exprs) . eval ( default_expr) ,
568+ match branches. default_branch {
569+ Some ( ( _, default_expr) ) => {
570+ local_exprs. push ( head_expr) ;
571+ self . eval_env ( & mut local_exprs) . eval ( default_expr)
572+ }
570573 None => panic_any ( Error :: MissingConstDefault ) ,
571574 }
572575 }
@@ -669,13 +672,15 @@ impl<'in_arena, 'env> QuoteEnv<'in_arena, 'env> {
669672 let mut branches = branches. clone ( ) ;
670673 let mut pattern_branches = SliceVec :: new ( scope, branches. num_patterns ( ) ) ;
671674
672- let default_expr = loop {
675+ let default_branch = loop {
673676 match self . elim_env . split_branches ( branches) {
674677 SplitBranches :: Branch ( ( r#const, body_expr) , next_branches) => {
675678 pattern_branches. push ( ( r#const, self . quote ( scope, & body_expr) ) ) ;
676679 branches = next_branches;
677680 }
678- SplitBranches :: Default ( default_expr) => break Some ( default_expr) ,
681+ SplitBranches :: Default ( default_name, default_expr) => {
682+ break Some ( ( default_name, default_expr) )
683+ }
679684 SplitBranches :: None => break None ,
680685 }
681686 } ;
@@ -684,7 +689,8 @@ impl<'in_arena, 'env> QuoteEnv<'in_arena, 'env> {
684689 span,
685690 scope. to_scope ( head_expr) ,
686691 pattern_branches. into ( ) ,
687- default_expr. map ( |expr| self . quote_closure ( scope, & expr) ) ,
692+ default_branch
693+ . map ( |( name, expr) | ( name, self . quote_closure ( scope, & expr) ) ) ,
688694 )
689695 }
690696 } ,
@@ -968,7 +974,7 @@ impl<'arena, 'env> EvalEnv<'arena, 'env> {
968974 }
969975 }
970976 }
971- Term :: ConstMatch ( span, head_expr, branches, default ) => {
977+ Term :: ConstMatch ( span, head_expr, branches, default_branch ) => {
972978 match self . unfold_meta_var_spines ( scope, head_expr) {
973979 TermOrValue :: Term ( head_expr) => TermOrValue :: Term ( Term :: ConstMatch (
974980 * span,
@@ -977,10 +983,12 @@ impl<'arena, 'env> EvalEnv<'arena, 'env> {
977983 ( branches. iter ( ) )
978984 . map ( |( r#const, expr) | ( * r#const, self . unfold_metas ( scope, expr) ) ) ,
979985 ) ,
980- default. map ( |expr| self . unfold_bound_metas ( scope, expr) ) ,
986+ default_branch
987+ . map ( |( name, expr) | ( name, self . unfold_bound_metas ( scope, expr) ) ) ,
981988 ) ) ,
982989 TermOrValue :: Value ( head_expr) => {
983- let branches = Branches :: new ( self . local_exprs . clone ( ) , branches, * default) ;
990+ let branches =
991+ Branches :: new ( self . local_exprs . clone ( ) , branches, * default_branch) ;
984992 TermOrValue :: Value ( self . elim_env . const_match ( head_expr, branches) )
985993 }
986994 }
@@ -1213,7 +1221,7 @@ impl<'arena, 'env> ConversionEnv<'arena, 'env> {
12131221 branches0 = next_branches0;
12141222 branches1 = next_branches1;
12151223 }
1216- ( Default ( default_expr0) , Default ( default_expr1) ) => {
1224+ ( Default ( _ , default_expr0) , Default ( _ , default_expr1) ) => {
12171225 return self . is_equal_closures ( & default_expr0, & default_expr1) ;
12181226 }
12191227 ( None , None ) => return true ,
0 commit comments