use crate::{
error::CursorError,
util::{Endianess, NativeEndian},
word::Word,
};
pub trait WordRead<W, E, End>
where
W: Word,
End: Endianess,
{
fn read(&mut self) -> Result<W, E>;
}
pub struct Cursor<'a, W>
where
W: Word,
{
data: &'a [W],
pos: usize,
}
impl<'a, W> Cursor<'a, W>
where
W: Word,
{
pub fn new<D>(data: D) -> Self
where
&'a [W]: From<D>,
{
Self {
data: data.into(),
pos: 0,
}
}
}
impl<'a, W> WordRead<W, CursorError, NativeEndian> for Cursor<'a, W>
where
W: Word,
{
fn read(&mut self) -> Result<W, CursorError>
where
W: Word,
{
if self.pos < self.data.len() {
let w = self.data[self.pos];
self.pos += 1;
Ok(w)
} else {
Err(CursorError::EndOfCursor)
}
}
}