use alloc::string::String;
use core::ops::Range;
#[cfg(not(feature = "std"))]
extern crate alloc;
#[derive(Debug, Clone)]
pub struct TextChange {
pub range: Range<usize>,
pub new_text: String,
pub line_range: Range<u32>,
}
#[must_use]
pub fn adjust_range_for_change(original_range: Range<usize>, change: &TextChange) -> Range<usize> {
if change.range.end <= original_range.start {
let new_len = change.new_text.len();
let old_len = change.range.end - change.range.start;
if new_len >= old_len {
let offset = new_len - old_len;
return (original_range.start + offset)..(original_range.end + offset);
}
let offset = old_len - new_len;
return original_range.start.saturating_sub(offset)
..original_range.end.saturating_sub(offset);
}
if change.range.start >= original_range.end {
return original_range;
}
let new_start = original_range.start.min(change.range.start);
let new_len = change.new_text.len();
let old_len = change.range.end - change.range.start;
let new_end = if change.range.end >= original_range.end {
change.range.start + new_len
} else {
if new_len >= old_len {
original_range.end + (new_len - old_len)
} else {
original_range.end.saturating_sub(old_len - new_len)
}
};
new_start..new_end
}