summaryrefslogtreecommitdiff
path: root/dhall/src/core/var.rs
diff options
context:
space:
mode:
authorNadrieril2019-08-16 23:17:46 +0200
committerNadrieril2019-08-16 23:18:01 +0200
commit8dec798929f35df15a7bc3a6caa4f0c7954c4ffc (patch)
treed57db0de1dad7e4c392d59e4366d8b96f1f6893c /dhall/src/core/var.rs
parentcc0c6cc420ca8019665e745797758c997cc35358 (diff)
Share type alongside the value in a thunk
Diffstat (limited to '')
-rw-r--r--dhall/src/core/var.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/dhall/src/core/var.rs b/dhall/src/core/var.rs
index 8d02171..ce4d137 100644
--- a/dhall/src/core/var.rs
+++ b/dhall/src/core/var.rs
@@ -157,6 +157,12 @@ impl Shift for () {
}
}
+impl<A: Shift, B: Shift> Shift for (A, B) {
+ fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> {
+ Some((self.0.shift(delta, var)?, self.1.shift(delta, var)?))
+ }
+}
+
impl<T: Shift> Shift for Option<T> {
fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> {
Some(match self {
@@ -230,6 +236,12 @@ impl<S> Subst<S> for () {
fn subst_shift(&self, _var: &AlphaVar, _val: &S) -> Self {}
}
+impl<S, A: Subst<S>, B: Subst<S>> Subst<S> for (A, B) {
+ fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self {
+ (self.0.subst_shift(var, val), self.1.subst_shift(var, val))
+ }
+}
+
impl<S, T: Subst<S>> Subst<S> for Option<T> {
fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self {
self.as_ref().map(|x| x.subst_shift(var, val))