From d6e5c56a5ef1d5f2b7cafd4a8fb44ce038932547 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sat, 18 Jan 2020 19:08:34 +0000 Subject: Add Expr visitor and improve tyexpr_to_expr --- dhall/src/semantics/tck/tyexpr.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'dhall/src/semantics/tck/tyexpr.rs') diff --git a/dhall/src/semantics/tck/tyexpr.rs b/dhall/src/semantics/tck/tyexpr.rs index a8b8e58..f0fcdd1 100644 --- a/dhall/src/semantics/tck/tyexpr.rs +++ b/dhall/src/semantics/tck/tyexpr.rs @@ -36,15 +36,14 @@ impl TyExpr { /// Converts a value back to the corresponding AST expression. pub fn to_expr<'a>(&'a self, opts: ToExprOptions) -> NormalizedExpr { - tyexpr_to_expr(self, opts, &Vec::new()) + tyexpr_to_expr(self, opts, &mut Vec::new()) } } -// TODO: mutate context once map_ref gets simplified fn tyexpr_to_expr<'a>( tyexpr: &'a TyExpr, opts: ToExprOptions, - ctx: &Vec<&'a Label>, + ctx: &mut Vec<&'a Label>, ) -> NormalizedExpr { rc(match tyexpr.kind() { TyExprKind::Var(v) if opts.alpha => { @@ -61,13 +60,16 @@ fn tyexpr_to_expr<'a>( ExprKind::Var(V(name.clone(), idx)) } TyExprKind::Expr(e) => { - let e = e.map_ref_with_special_handling_of_binders( - |tye| tyexpr_to_expr(tye, opts, ctx), - |l, tye| { - let ctx = ctx.iter().copied().chain(Some(l)).collect(); - tyexpr_to_expr(tye, opts, &ctx) - }, - ); + let e = e.map_ref_maybe_binder(|l, tye| { + if let Some(l) = l { + ctx.push(l); + } + let e = tyexpr_to_expr(tye, opts, ctx); + if let Some(_) = l { + ctx.pop(); + } + e + }); match e { ExprKind::Lam(_, t, e) if opts.alpha => { -- cgit v1.2.3