use super::{Highlighter, LineState};
#[derive(Debug, Default)]
pub(crate) struct LineStates {
starts: Vec<LineState>,
spans: Vec<super::Span>,
}
impl LineStates {
pub(crate) fn edited(&mut self, line: usize) {
self.starts.truncate(line + 1);
}
#[cfg(test)]
pub(crate) fn known(&self) -> usize {
self.starts.len()
}
pub(crate) fn start_of<'a>(
&mut self,
target: usize,
hl: &dyn Highlighter,
line: impl Fn(usize) -> &'a str,
) -> LineState {
if self.starts.is_empty() {
self.starts.push(LineState::default());
}
while self.starts.len() <= target {
let i = self.starts.len() - 1;
self.spans.clear();
let next = hl.line(line(i), self.starts[i], &mut self.spans);
self.starts.push(next);
}
self.starts[target]
}
pub(crate) fn learn(&mut self, line: usize, after: LineState) {
if self.starts.len() == line + 1 {
self.starts.push(after);
}
}
}