From f7a8d967b02bc20c093d501746ed3de53cc7da13 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 17 Jan 2020 10:49:02 +0000 Subject: Simplify Shift and Subst instances --- dhall/src/semantics/core/var.rs | 144 +--------------------------------------- 1 file changed, 1 insertion(+), 143 deletions(-) (limited to 'dhall/src/semantics/core/var.rs') diff --git a/dhall/src/semantics/core/var.rs b/dhall/src/semantics/core/var.rs index 99d3125..c21e53e 100644 --- a/dhall/src/semantics/core/var.rs +++ b/dhall/src/semantics/core/var.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use crate::syntax::{ExprKind, InterpolatedTextContents, Label, V}; +use crate::syntax::{Label, V}; /// Stores a pair of variables: a normal one and one /// that corresponds to the alpha-normalized version of the first one. @@ -143,145 +143,3 @@ impl From for Label { x.name } } -impl Shift for () { - fn shift(&self, _delta: isize, _var: &AlphaVar) -> Option { - Some(()) - } -} - -impl Shift for (A, B) { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some((self.0.shift(delta, var)?, self.1.shift(delta, var)?)) - } -} - -impl Shift for Option { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(match self { - None => None, - Some(x) => Some(x.shift(delta, var)?), - }) - } -} - -impl Shift for Box { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(Box::new(self.as_ref().shift(delta, var)?)) - } -} - -impl Shift for std::rc::Rc { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(std::rc::Rc::new(self.as_ref().shift(delta, var)?)) - } -} - -impl Shift for std::cell::RefCell { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(std::cell::RefCell::new(self.borrow().shift(delta, var)?)) - } -} - -impl Shift for ExprKind { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(self.traverse_ref_with_special_handling_of_binders( - |v| Ok(v.shift(delta, var)?), - |x, v| Ok(v.shift(delta, &var.under_binder(x))?), - )?) - } -} - -impl Shift for Vec { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some( - self.iter() - .map(|v| Ok(v.shift(delta, var)?)) - .collect::>()?, - ) - } -} - -impl Shift for HashMap -where - K: Clone + std::hash::Hash + Eq, -{ - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some( - self.iter() - .map(|(k, v)| Ok((k.clone(), v.shift(delta, var)?))) - .collect::>()?, - ) - } -} - -impl Shift for InterpolatedTextContents { - fn shift(&self, delta: isize, var: &AlphaVar) -> Option { - Some(self.traverse_ref(|x| Ok(x.shift(delta, var)?))?) - } -} - -impl Subst for () { - fn subst_shift(&self, _var: &AlphaVar, _val: &S) -> Self {} -} - -impl, B: Subst> Subst 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> Subst for Option { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - self.as_ref().map(|x| x.subst_shift(var, val)) - } -} - -impl> Subst for Box { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - Box::new(self.as_ref().subst_shift(var, val)) - } -} - -impl> Subst for std::rc::Rc { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - std::rc::Rc::new(self.as_ref().subst_shift(var, val)) - } -} - -impl> Subst for std::cell::RefCell { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - std::cell::RefCell::new(self.borrow().subst_shift(var, val)) - } -} - -impl, E: Clone> Subst for ExprKind { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - self.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)), - ) - } -} - -impl> Subst for Vec { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - self.iter().map(|v| v.subst_shift(var, val)).collect() - } -} - -impl> Subst for InterpolatedTextContents { - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - self.map_ref(|x| x.subst_shift(var, val)) - } -} - -impl> Subst for HashMap -where - K: Clone + std::hash::Hash + Eq, -{ - fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self { - self.iter() - .map(|(k, v)| (k.clone(), v.subst_shift(var, val))) - .collect() - } -} -- cgit v1.2.3