Skip to content

Instantly share code, notes, and snippets.

@sdleffler
Created January 12, 2017 21:47
Show Gist options
  • Save sdleffler/578e765ec197b566c769d21fd7019851 to your computer and use it in GitHub Desktop.
Save sdleffler/578e765ec197b566c769d21fd7019851 to your computer and use it in GitHub Desktop.
impl<'a, P: Pattern> Pattern for &'a [P] {
type BindIter = iter::FlatMap<slice::Iter<'a, P>, P::BindIter, fn(&P) -> P::BindIter>;
type PatFvIter = iter::FlatMap<slice::Iter<'a, P>, P::PatFvIter, fn(&P) -> P::PatFvIter>;
fn pattern_binders(&self) -> Self::BindIter {
self.iter().flat_map(P::pattern_binders)
}
fn pattern_free_vars(&self) -> Self::PatFvIter {
self.iter().flat_map(P::pattern_free_vars)
}
fn pattern_alpha_eq(depth: usize, lhs: &Self, rhs: &Self) -> bool {
lhs.len() == rhs.len() &&
lhs.iter().zip(rhs.iter()).all(|(l, r)| Pattern::pattern_alpha_eq(depth, l, r))
}
}
impl<'a, P: Pattern> Pattern for &'a mut [P] {
type BindIter = iter::FlatMap<slice::Iter<'a, P>, P::BindIter, fn(&P) -> P::BindIter>;
type PatFvIter = iter::FlatMap<slice::Iter<'a, P>, P::PatFvIter, fn(&P) -> P::PatFvIter>;
fn pattern_binders(&self) -> Self::BindIter {
let r: &'a mut [P] = *self;
(r as &'a [P]).pattern_binders()
}
fn pattern_free_vars(&self) -> Self::PatFvIter {
self.iter().flat_map(P::pattern_free_vars)
}
fn pattern_alpha_eq(depth: usize, lhs: &Self, rhs: &Self) -> bool {
lhs.len() == rhs.len() &&
lhs.iter().zip(rhs.iter()).all(|(l, r)| Pattern::pattern_alpha_eq(depth, l, r))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment