use crate::Row;
#[derive(Debug, Clone)]
pub struct Cursor {
rows: Vec<Row>,
position: usize,
}
impl Cursor {
pub fn new(rows: Vec<Row>) -> Self {
Self { rows, position: 0 }
}
pub fn advance(&mut self) -> Option<&Row> {
let pos = self.position;
if pos < self.rows.len() {
self.position = pos + 1;
self.rows.get(pos)
} else {
None
}
}
pub fn peek(&self) -> Option<&Row> {
self.rows.get(self.position)
}
pub fn reset(&mut self) {
self.position = 0;
}
pub fn position(&self) -> usize {
self.position
}
pub fn len(&self) -> usize {
self.rows.len()
}
pub fn is_empty(&self) -> bool {
self.rows.is_empty()
}
pub fn remaining(&self) -> usize {
self.rows.len().saturating_sub(self.position)
}
pub fn into_rows(self) -> Vec<Row> {
self.rows
}
pub fn skip_by(&mut self, n: usize) {
self.position = (self.position + n).min(self.rows.len());
}
}
impl Iterator for Cursor {
type Item = Row;
fn next(&mut self) -> Option<Row> {
let pos = self.position;
if pos < self.rows.len() {
self.position = pos + 1;
Some(self.rows[pos].clone())
} else {
None
}
}
}