use std::cmp::{max, min};
use std::ops::Range;
use crate::text::EditableText;
#[derive(Debug, Clone, Copy)]
pub struct Selection {
pub start: usize,
pub end: usize,
}
impl Selection {
pub fn new(start: usize, end: usize) -> Self {
Selection { start, end }
}
pub fn all(&mut self, text: &impl EditableText) {
self.start = 0;
self.end = text.len();
}
pub fn caret(pos: usize) -> Self {
Selection {
start: pos,
end: pos,
}
}
pub fn is_caret(self) -> bool {
self.start == self.end
}
pub fn min(self) -> usize {
min(self.start, self.end)
}
pub fn max(self) -> usize {
max(self.start, self.end)
}
pub fn range(self) -> Range<usize> {
self.min()..self.max()
}
pub fn constrain_to(mut self, s: &impl EditableText) -> Self {
let s_len = s.len();
self.start = min(self.start, s_len);
self.end = min(self.end, s_len);
self
}
}