use std::ops::{Index, IndexMut}; pub struct RingBuffer { buffer: [T; N], index: usize, } impl RingBuffer where T: Copy, { pub const fn new(value: T) -> Self { Self { buffer: [value; N], index: 0, } } pub const fn len(&self) -> usize { N } pub fn shift(&mut self) { self.index = (self.index + 1) % N; } } impl Index for RingBuffer { type Output = T; fn index(&self, index: usize) -> &Self::Output { &self.buffer[(self.index + index) % N] } } impl IndexMut for RingBuffer { fn index_mut(&mut self, index: usize) -> &mut Self::Output { &mut self.buffer[(self.index + index) % N] } }