use generic_array::{ArrayLength, GenericArray};
use std::ops::{Deref, Index, IndexMut};
pub struct WrappingArray<T, N: ArrayLength<T>>(GenericArray<T, N>);
impl<T, N: ArrayLength<T>, I: Into<GenericArray<T, N>>> From<I>
for WrappingArray<T, N>
{
fn from(array: I) -> Self {
WrappingArray(array.into())
}
}
impl<T, N: ArrayLength<T>> Deref for WrappingArray<T, N> {
type Target = GenericArray<T, N>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T, N: ArrayLength<T>> Index<usize> for WrappingArray<T, N> {
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
&self.0[index % self.0.len()]
}
}
impl<T, N: ArrayLength<T>> IndexMut<usize> for WrappingArray<T, N> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
let len = self.0.len();
&mut self.0[index % len]
}
}