diff options
author | Nadrieril | 2019-05-08 00:33:49 +0200 |
---|---|---|
committer | Nadrieril | 2019-05-08 00:33:49 +0200 |
commit | 7680ff4d5ebe7b98cdc54bd0e90a8d22395f715f (patch) | |
tree | 16c76c47fa56ba6cf97453c2ae358894c8a68eca /dhall/src/core/var.rs | |
parent | 19e0ecfdb832985dd833dade252637a760c71e85 (diff) |
shift on lookup instead of on insert
Diffstat (limited to 'dhall/src/core/var.rs')
-rw-r--r-- | dhall/src/core/var.rs | 21 |
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; } |