use std::cmp::min;
use ropey::RopeSlice;
use super::TextBuffer;
use crate::buffer::{Pos, Selection};
impl TextBuffer {
pub fn slice_chars_ref(&self, mut start: usize, mut end: usize) -> RopeSlice<'_> {
let maxc = self.len_chars();
start = min(start, maxc);
end = min(end, maxc);
if start > end {
std::mem::swap(&mut start, &mut end);
}
self.rope().slice(start..end)
}
pub fn slice_selection_ref(&self, sel: Selection) -> RopeSlice<'_> {
let (a, b) = sel.ordered();
let start = self.pos_to_char(a);
let end = self.pos_to_char(b);
self.slice_chars_ref(start, end)
}
pub fn slice_pos_range_ref(&self, a: Pos, b: Pos) -> RopeSlice<'_> {
let start = self.pos_to_char(a);
let end = self.pos_to_char(b);
self.slice_chars_ref(start, end)
}
#[inline]
pub fn to_string(&self) -> String {
self.rope().to_string()
}
pub fn slice_chars(&self, start: usize, end: usize) -> String {
self.slice_chars_ref(start, end).to_string()
}
pub fn slice_selection(&self, sel: Selection) -> String {
self.slice_selection_ref(sel).to_string()
}
pub fn slice_pos_range(&self, a: Pos, b: Pos) -> String {
self.slice_pos_range_ref(a, b).to_string()
}
}