From 7680ff4d5ebe7b98cdc54bd0e90a8d22395f715f Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Wed, 8 May 2019 00:33:49 +0200 Subject: shift on lookup instead of on insert --- dhall/src/core/var.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'dhall/src/core/var.rs') 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) -> 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: Shift { +pub(crate) trait Subst { fn subst_shift(&self, var: &AlphaVar, val: &T) -> Self; } -- cgit v1.2.3