use std::slice;
use std::str::Chars;
pub struct CursorBytes<'a>(&'a str, slice::Iter<'a, u8>);
impl<'a> CursorBytes<'a> {
pub fn new(x: &'a str) -> Self {
Self(x, x.as_bytes().iter())
}
pub fn next(&mut self) -> Option<u8> {
self.1.next().copied()
}
pub fn next_char(&mut self) -> Option<char> {
self.next().map(|x| x as char)
}
pub fn pos(&self) -> usize {
self.0.len() - self.1.as_slice().len()
}
}
pub struct CursorChars<'a>(&'a str, Chars<'a>);
impl<'a> CursorChars<'a> {
pub fn new_offset(x: &'a str, offset: usize) -> Self {
Self(x, x[offset..].chars())
}
pub fn next(&mut self) -> Option<char> {
self.1.next()
}
pub fn unnext(&mut self, c: char) {
let pos = self.pos();
self.1 = self.0[pos - c.len_utf8()..].chars();
debug_assert_eq!(self.peek(), Some(c))
}
pub fn peek(&self) -> Option<char> {
self.1.as_str().chars().next()
}
pub fn pos(&self) -> usize {
self.0.len() - self.1.as_str().len()
}
}