summaryrefslogtreecommitdiff
path: root/dhall/src/core/thunk.rs
diff options
context:
space:
mode:
authorNadrieril2019-08-16 22:33:16 +0200
committerNadrieril2019-08-16 22:33:16 +0200
commitcc0c6cc420ca8019665e745797758c997cc35358 (patch)
tree38afd8786d959d4cc244ca048b94c3f069e3d97e /dhall/src/core/thunk.rs
parent961dbc0e9d52691de590568c01a22d28c04fe2f5 (diff)
Use generic Shift/Subst impls
Diffstat (limited to 'dhall/src/core/thunk.rs')
-rw-r--r--dhall/src/core/thunk.rs35
1 files changed, 8 insertions, 27 deletions
diff --git a/dhall/src/core/thunk.rs b/dhall/src/core/thunk.rs
index e315a90..b6358ef 100644
--- a/dhall/src/core/thunk.rs
+++ b/dhall/src/core/thunk.rs
@@ -266,24 +266,16 @@ impl TypedThunk {
impl Shift for Thunk {
fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> {
- Some(
- self.0
- .borrow()
- .shift(delta, var)?
- .into_thunk(self.1.shift(delta, var)?),
- )
+ Some(Thunk(self.0.shift(delta, var)?, self.1.shift(delta, var)?))
}
}
impl Shift for ThunkInternal {
fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> {
Some(match self {
- ThunkInternal::PartialExpr(e) => ThunkInternal::PartialExpr(
- e.traverse_ref_with_special_handling_of_binders(
- |v| Ok(v.shift(delta, var)?),
- |x, v| Ok(v.shift(delta, &var.under_binder(x))?),
- )?,
- ),
+ ThunkInternal::PartialExpr(e) => {
+ ThunkInternal::PartialExpr(e.shift(delta, var)?)
+ }
ThunkInternal::ValueF(m, v) => {
ThunkInternal::ValueF(*m, v.shift(delta, var)?)
}
@@ -301,27 +293,16 @@ impl Shift for TypedThunk {
impl Subst<Typed> for Thunk {
fn subst_shift(&self, var: &AlphaVar, val: &Typed) -> Self {
- self.0
- .borrow()
- .subst_shift(var, val)
- .into_thunk(self.1.subst_shift(var, val))
+ Thunk(self.0.subst_shift(var, val), self.1.subst_shift(var, val))
}
}
impl Subst<Typed> for ThunkInternal {
fn subst_shift(&self, var: &AlphaVar, val: &Typed) -> Self {
match self {
- ThunkInternal::PartialExpr(e) => ThunkInternal::PartialExpr(
- e.map_ref_with_special_handling_of_binders(
- |v| v.subst_shift(var, val),
- |x, v| {
- v.subst_shift(
- &var.under_binder(x),
- &val.under_binder(x),
- )
- },
- ),
- ),
+ ThunkInternal::PartialExpr(e) => {
+ ThunkInternal::PartialExpr(e.subst_shift(var, val))
+ }
ThunkInternal::ValueF(_, v) => {
// The resulting value may not stay in normal form after substitution
ThunkInternal::ValueF(WHNF, v.subst_shift(var, val))