#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct Span {
pub start: u32,
pub end: u32,
}
impl Span {
pub const fn new(start: u32, end: u32) -> Self {
Self { start, end }
}
pub const fn empty() -> Self {
Self { start: 0, end: 0 }
}
pub fn merge(self, other: Span) -> Span {
Span {
start: self.start.min(other.start),
end: self.end.max(other.end),
}
}
pub fn is_empty(self) -> bool {
self.start == self.end
}
pub fn len(self) -> u32 {
self.end.saturating_sub(self.start)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Spanned<T> {
pub value: T,
pub span: Span,
}
impl<T> Spanned<T> {
pub fn new(value: T, span: Span) -> Self {
Self { value, span }
}
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Spanned<U> {
Spanned {
value: f(self.value),
span: self.span,
}
}
}