use std::cmp::Ordering;
use crate::style::Style;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Span {
pub start: usize,
pub end: usize,
pub style: Style,
}
impl Span {
pub fn new(start: usize, end: usize, style: Style) -> Self {
Span { start, end, style }
}
pub fn is_empty(&self) -> bool {
self.end <= self.start
}
pub fn split(&self, offset: usize) -> (Span, Option<Span>) {
if offset < self.start || offset >= self.end {
return (self.clone(), None);
}
let left = Span::new(self.start, offset, self.style.clone());
let right = Span::new(offset, self.end, self.style.clone());
(left, Some(right))
}
pub fn move_span(&self, offset: usize) -> Span {
Span::new(
self.start.saturating_add(offset),
self.end.saturating_add(offset),
self.style.clone(),
)
}
pub fn right_crop(&self, offset: usize) -> Span {
Span::new(
self.start,
std::cmp::min(offset, self.end),
self.style.clone(),
)
}
pub fn extend(&self, cells: usize) -> Span {
Span::new(self.start, self.end + cells, self.style.clone())
}
}
impl PartialOrd for Span {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Span {
fn cmp(&self, other: &Self) -> Ordering {
(self.start, self.end).cmp(&(other.start, other.end))
}
}
impl std::hash::Hash for Span {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.start.hash(state);
self.end.hash(state);
self.style.hash(state);
}
}