use crate::{
rope::{
atoms::{Atom, Atoms},
length_summary::LengthExtendedGraphemes,
},
utils::Utils,
};
pub struct Line<'r, 'a> {
atoms: &'a mut Atoms<'r>,
seen_newline: bool,
}
impl<'r, 'a> Line<'r, 'a> {
const INITIAL_SEEN_NEWLINE: bool = false;
pub const fn new(atoms: &'a mut Atoms<'r>) -> Self {
let seen_newline = Self::INITIAL_SEEN_NEWLINE;
Self { atoms, seen_newline }
}
pub fn advance(&mut self, len_extended_graphemes: LengthExtendedGraphemes) {
if self.seen_newline {
return;
}
let length_advanced = self.atoms.advance_within_line(len_extended_graphemes).into_ok_err();
if length_advanced.lines().is_positive() {
self.seen_newline.set_true();
}
}
}
impl<'r> Iterator for Line<'r, '_> {
type Item = Atom<'r>;
fn next(&mut self) -> Option<Self::Item> {
if self.seen_newline {
return None;
}
let atom = self.atoms.next()?;
if atom.extended_grapheme().is_newline() {
self.seen_newline.set_true();
}
atom.some()
}
}