pub(crate) struct VecPointerRef<'a, T> {
values: &'a [T],
pub(crate) index: usize,
}
impl<'a, T> VecPointerRef<'a, T> {
pub(crate) fn new(values: &[T]) -> VecPointerRef<'_, T> {
VecPointerRef { values, index: 0 }
}
pub(crate) fn current(&self) -> Option<&T> {
self.get(self.index)
}
pub(crate) fn next(&mut self) -> Option<&T> {
self.next_add(1)
}
pub(crate) fn next_add(&mut self, i: usize) -> Option<&T> {
let index = self.index;
self.index = self.index.saturating_add(i);
self.get(index)
}
pub(crate) fn prev(&mut self) -> Option<&T> {
self.prev_sub(1)
}
pub(crate) fn prev_sub(&mut self, i: usize) -> Option<&T> {
if i > self.index {
return None;
} else {
self.index -= i;
}
self.current()
}
pub(crate) fn peek_add(&self, i: usize) -> Option<&T> {
self.index.checked_add(i).and_then(|idx| self.get(idx))
}
pub(crate) fn consume_while(&mut self, pred: impl Fn(&T) -> bool) -> &'a [T] {
let start = self.index;
while self.index < self.values.len() && pred(&self.values[self.index]) {
self.index += 1;
}
&self.values[start..self.index]
}
fn get(&self, index: usize) -> Option<&T> {
if index >= self.values.len() {
return None;
}
Some(&self.values[index])
}
}