use crate::position::Position;
#[derive(Debug, Default, Clone, Copy)]
pub struct Shift {
lines: isize,
cols: isize,
col_line: Option<usize>,
}
impl Shift {
pub fn apply(&self, pos: Position) -> Position {
let col = if self.col_line == Some(pos.line) {
(pos.col as isize + self.cols).max(0) as usize
} else {
pos.col
};
Position {
line: (pos.line as isize + self.lines).max(0) as usize,
col,
}
}
pub fn record(&mut self, original_end_line: usize, applied_end: Position, after: Position) {
let col_delta = after.col as isize - applied_end.col as isize;
if self.col_line == Some(original_end_line) {
self.cols += col_delta;
} else {
self.cols = col_delta;
self.col_line = Some(original_end_line);
}
self.lines += after.line as isize - applied_end.line as isize;
}
}