use itertools::{Itertools, MultiPeek}; use std::str::Chars; pub(super) struct StringWalker<'a> { chars: MultiPeek>, 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 { 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() } }