pub trait IndexIsize {
type T;
fn iidx(&self, idx: isize) -> usize;
fn iget(&self, idx: isize) -> &Self::T;
fn iget_mut(&mut self, idx: isize) -> &mut Self::T;
}
impl<T> IndexIsize for Vec<T> {
type T = T;
fn iidx(&self, idx: isize) -> usize {
idx.rem_euclid(self.len() as isize) as usize
}
fn iget(&self, idx: isize) -> &Self::T {
&self[self.iidx(idx)]
}
fn iget_mut(&mut self, idx: isize) -> &mut Self::T {
let idx = self.iidx(idx);
&mut self[idx]
}
}
impl<T> IndexIsize for [T] {
type T = T;
fn iidx(&self, idx: isize) -> usize {
idx.rem_euclid(self.len() as isize) as usize
}
fn iget(&self, idx: isize) -> &Self::T {
&self[self.iidx(idx)]
}
fn iget_mut(&mut self, idx: isize) -> &mut Self::T {
let idx = self.iidx(idx);
&mut self[idx]
}
}
impl<T, const N: usize> IndexIsize for [T; N] {
type T = T;
fn iidx(&self, idx: isize) -> usize {
idx.rem_euclid(N as isize) as usize
}
fn iget(&self, idx: isize) -> &Self::T {
&self[self.iidx(idx)]
}
fn iget_mut(&mut self, idx: isize) -> &mut Self::T {
let idx = self.iidx(idx);
&mut self[idx]
}
}