SeraphScript/src/parsing/lexer/string_walker.rs

41 lines
1018 B
Rust

use itertools::{Itertools, MultiPeek};
use std::str::Chars;
pub(super) struct StringWalker<'a> {
chars: MultiPeek<Chars<'a>>,
pub(crate) real_position: usize,
pub(crate) peek_position: usize,
}
impl<'a> StringWalker<'a> {
pub fn create(s: &str) -> StringWalker {
StringWalker {
chars: s.chars().multipeek(),
real_position: 0,
peek_position: 0,
}
}
pub fn peek(&mut self) -> Option<&char> {
self.peek_position += 1;
self.chars.peek()
}
pub fn next(&mut self) -> Option<char> {
self.real_position += 1;
self.peek_position = self.real_position;
self.chars.next()
}
pub fn reset_peek(&mut self) {
self.peek_position = self.real_position;
self.chars.reset_peek()
}
pub fn take(&mut self, length: usize) -> String {
self.real_position += length;
self.peek_position = self.real_position;
self.chars.by_ref().take(length).collect()
}
}