pub struct MultiZip<I: Iterator>(Vec<I>);
impl<I: Iterator> MultiZip<I> {
pub fn new(vec_of_iters: Vec<I>) -> Self {
Self(vec_of_iters)
}
}
impl<I: Iterator> Iterator for MultiZip<I> {
type Item = Vec<I::Item>;
fn next(&mut self) -> Option<Self::Item> {
self.0.iter_mut().map(Iterator::next).collect()
}
}
pub trait WrappingGet<T> {
fn wrapping_next(&self, idx: usize) -> &T;
fn wrapping_prev(&self, idx: usize) -> &T;
}
impl<T> WrappingGet<T> for &[T] {
fn wrapping_next(&self, idx: usize) -> &T {
&self[match idx {
_ if idx == self.len() - 1 => 0,
_ => idx + 1,
}]
}
fn wrapping_prev(&self, idx: usize) -> &T {
&self[match idx {
_ if idx == 0 => self.len() - 1,
_ => idx - 1,
}]
}
}