use core::ops;
pub(crate) struct DynIndexer {
offset: usize,
max: usize,
}
impl DynIndexer {
pub(crate) fn new(max: usize) -> Self {
Self { offset: 0, max }
}
pub(crate) fn iter(&mut self) -> DynIndexIter {
let offset = self.offset;
if self.max > 0 {
self.offset = (self.offset + 1).wrapping_rem(self.max);
}
DynIndexIter {
iter: (0..self.max),
offset,
}
}
}
pub(crate) struct DynIndexIter {
iter: ops::Range<usize>,
offset: usize,
}
impl Iterator for DynIndexIter {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
self.iter
.next()
.map(|pos| (pos + self.offset).wrapping_rem(self.iter.end))
}
}