From 31a03bf9140a2fdf5eb52d0998d2d41efaf0d610 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Tue, 3 Sep 2019 16:43:45 +0200 Subject: Use map_mut in ValueF::normalize_mut --- dhall/src/core/value.rs | 11 ----------- dhall/src/core/valuef.rs | 7 ++----- 2 files changed, 2 insertions(+), 16 deletions(-) (limited to 'dhall/src/core') diff --git a/dhall/src/core/value.rs b/dhall/src/core/value.rs index 3cccb1d..b4b6b08 100644 --- a/dhall/src/core/value.rs +++ b/dhall/src/core/value.rs @@ -212,17 +212,6 @@ impl Value { WHNF | NF => {} } } - pub(crate) fn normalize_nf(&self) { - let borrow = self.as_internal(); - match borrow.form { - Unevaled | WHNF => { - drop(borrow); - self.as_internal_mut().normalize_nf(); - } - // Already in NF - NF => {} - } - } pub(crate) fn app(&self, v: Value) -> Value { let body_t = match &*self.get_type_not_sort().as_whnf() { diff --git a/dhall/src/core/valuef.rs b/dhall/src/core/valuef.rs index 7ecec86..7a2b51c 100644 --- a/dhall/src/core/valuef.rs +++ b/dhall/src/core/valuef.rs @@ -189,7 +189,7 @@ impl ValueF { for x in elts.iter_mut() { use InterpolatedTextContents::{Expr, Text}; match x { - Expr(n) => n.normalize_mut(), + Expr(v) => v.normalize_mut(), Text(_) => {} } } @@ -199,10 +199,7 @@ impl ValueF { y.normalize_mut(); } ValueF::PartialExpr(e) => { - // TODO: need map_mut - e.map_ref(|v| { - v.normalize_nf(); - }); + e.map_mut(Value::normalize_mut); } } } -- cgit v1.3.1 From f1c3d1d7487fbb18b228a1082fc1c966f34b6dc3 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Tue, 3 Sep 2019 16:44:02 +0200 Subject: Add mapping functions to InterpolatedTextContents --- dhall/src/core/valuef.rs | 22 ++++++--------------- dhall/src/core/var.rs | 12 ++--------- dhall_syntax/src/core/text.rs | 46 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 26 deletions(-) (limited to 'dhall/src/core') diff --git a/dhall/src/core/valuef.rs b/dhall/src/core/valuef.rs index 7a2b51c..4e457e6 100644 --- a/dhall/src/core/valuef.rs +++ b/dhall/src/core/valuef.rs @@ -110,17 +110,11 @@ impl ValueF { ValueF::UnionConstructor(l.clone(), kts.clone()).to_expr(opts), v.to_expr(opts), )), - ValueF::TextLit(elts) => { - use InterpolatedTextContents::{Expr, Text}; - rc(ExprF::TextLit( - elts.iter() - .map(|contents| match contents { - Expr(e) => Expr(e.to_expr(opts)), - Text(s) => Text(s.clone()), - }) - .collect(), - )) - } + ValueF::TextLit(elts) => rc(ExprF::TextLit( + elts.iter() + .map(|contents| contents.map_ref(|e| e.to_expr(opts))) + .collect(), + )), ValueF::Equivalence(x, y) => rc(ExprF::BinOp( dhall_syntax::BinOp::Equivalence, x.to_expr(opts), @@ -187,11 +181,7 @@ impl ValueF { } ValueF::TextLit(elts) => { for x in elts.iter_mut() { - use InterpolatedTextContents::{Expr, Text}; - match x { - Expr(v) => v.normalize_mut(), - Text(_) => {} - } + x.map_mut(Value::normalize_mut); } } ValueF::Equivalence(x, y) => { diff --git a/dhall/src/core/var.rs b/dhall/src/core/var.rs index ce4d137..3795f10 100644 --- a/dhall/src/core/var.rs +++ b/dhall/src/core/var.rs @@ -224,11 +224,7 @@ where impl Shift for dhall_syntax::InterpolatedTextContents { fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - use dhall_syntax::InterpolatedTextContents::{Expr, Text}; - Some(match self { - Expr(x) => Expr(x.shift(delta, var)?), - Text(s) => Text(s.clone()), - }) + Some(self.traverse_ref(|x| Ok(x.shift(delta, var)?))?) } } @@ -283,11 +279,7 @@ impl> Subst for Vec { impl> Subst for dhall_syntax::InterpolatedTextContents { fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - use dhall_syntax::InterpolatedTextContents::{Expr, Text}; - match self { - Expr(x) => Expr(x.subst_shift(var, val)), - Text(s) => Text(s.clone()), - } + self.map_ref(|x| x.subst_shift(var, val)) } } diff --git a/dhall_syntax/src/core/text.rs b/dhall_syntax/src/core/text.rs index e17f00f..fb390ee 100644 --- a/dhall_syntax/src/core/text.rs +++ b/dhall_syntax/src/core/text.rs @@ -40,6 +40,52 @@ impl InterpolatedTextContents { Text(s) => s.is_empty(), } } + + pub fn traverse_ref<'a, SubExpr2, E, F>( + &'a self, + mut f: F, + ) -> Result, E> + where + F: FnMut(&'a SubExpr) -> Result, + { + use InterpolatedTextContents::{Expr, Text}; + Ok(match self { + Expr(e) => Expr(f(e)?), + Text(s) => Text(s.clone()), + }) + } + pub fn traverse_mut<'a, E, F>(&'a mut self, mut f: F) -> Result<(), E> + where + F: FnMut(&'a mut SubExpr) -> Result<(), E>, + { + use InterpolatedTextContents::Expr; + if let Expr(e) = self { + f(e)?; + } + Ok(()) + } + pub fn map_ref<'a, SubExpr2, F>( + &'a self, + mut f: F, + ) -> InterpolatedTextContents + where + F: FnMut(&'a SubExpr) -> SubExpr2, + { + use InterpolatedTextContents::{Expr, Text}; + match self { + Expr(e) => Expr(f(e)), + Text(s) => Text(s.clone()), + } + } + pub fn map_mut<'a, F>(&'a mut self, mut f: F) + where + F: FnMut(&'a mut SubExpr), + { + use InterpolatedTextContents::Expr; + if let Expr(e) = self { + f(e); + } + } } impl InterpolatedText { -- cgit v1.3.1