summaryrefslogtreecommitdiff
path: root/dhall/src/core/var.rs
diff options
context:
space:
mode:
authorNadrieril2019-05-08 00:33:49 +0200
committerNadrieril2019-05-08 00:33:49 +0200
commit7680ff4d5ebe7b98cdc54bd0e90a8d22395f715f (patch)
tree16c76c47fa56ba6cf97453c2ae358894c8a68eca /dhall/src/core/var.rs
parent19e0ecfdb832985dd833dade252637a760c71e85 (diff)
shift on lookup instead of on insert
Diffstat (limited to '')
-rw-r--r--dhall/src/core/var.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/dhall/src/core/var.rs b/dhall/src/core/var.rs
index 2a564bf..ba92172 100644
--- a/dhall/src/core/var.rs
+++ b/dhall/src/core/var.rs
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+
use dhall_syntax::{Label, V};
/// Stores a pair of variables: a normal one and if relevant one
@@ -14,11 +16,26 @@ pub(crate) struct AlphaVar {
#[derive(Debug, Clone, Eq)]
pub(crate) struct AlphaLabel(Label);
-pub(crate) trait Shift {
+pub(crate) trait Shift: Sized {
fn shift(&self, delta: isize, var: &AlphaVar) -> Self;
+
+ fn shift0(&self, delta: isize, x: &Label) -> Self {
+ self.shift(delta, &x.into())
+ }
+
+ fn shift0_multiple(&self, shift_map: &HashMap<Label, isize>) -> Self
+ where
+ Self: Clone,
+ {
+ let mut v = self.clone();
+ for (x, n) in shift_map {
+ v = v.shift0(*n, x);
+ }
+ v
+ }
}
-pub(crate) trait Subst<T>: Shift {
+pub(crate) trait Subst<T> {
fn subst_shift(&self, var: &AlphaVar, val: &T) -> Self;
}