From 8e2da26650e202f9ccb1531fc8a88cfd89e54b6d Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 27 Dec 2019 15:15:08 +0000 Subject: Implement traverse_ref for ValueKind --- dhall/src/semantics/core/value.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'dhall/src/semantics/core/value.rs') diff --git a/dhall/src/semantics/core/value.rs b/dhall/src/semantics/core/value.rs index 5f244b7..f7c2fbf 100644 --- a/dhall/src/semantics/core/value.rs +++ b/dhall/src/semantics/core/value.rs @@ -388,6 +388,34 @@ impl ValueKind { } } +impl ValueKind { + #[allow(dead_code)] + pub(crate) fn map_ref_with_special_handling_of_binders<'a, V2>( + &'a self, + mut map_val: impl FnMut(&'a V) -> V2, + mut map_under_binder: impl FnMut(&'a AlphaLabel, &'a V) -> V2, + ) -> ValueKind { + use crate::semantics::visitor; + use crate::syntax::trivial_result; + use visitor::ValueKindVisitor; + trivial_result( + visitor::TraverseRefWithBindersVisitor { + visit_val: |x| Ok(map_val(x)), + visit_under_binder: |l, x| Ok(map_under_binder(l, x)), + } + .visit(self), + ) + } +} + +// #[allow(dead_code)] +// fn equiv(x: &Value, y:&Value) -> bool { +// let map = |kind| { + +// }; +// map(x) == map(y) +// } + impl Shift for Value { fn shift(&self, delta: isize, var: &AlphaVar) -> Option { Some(Value(self.0.shift(delta, var)?)) -- cgit v1.2.3