use core::fmt;
pub type Pos = usize;
#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
pub struct Span {
pub start: Pos,
pub len: usize,
}
pub trait Spannable: Sized {
fn with_span(self, span: Span) -> Spanned<Self>;
}
impl<T> Spannable for T {
fn with_span(self, span: Span) -> Spanned<Self> {
Spanned { node: self, span }
}
}
impl Span {
pub fn new(start: Pos, len: usize) -> Self {
Span { start, len }
}
pub fn start(&self) -> Pos {
self.start
}
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn end(&self) -> Pos {
self.start + self.len
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Spanned<T> {
pub node: T,
pub span: Span,
}
impl<T: fmt::Display> fmt::Display for Spanned<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{} at {}-{}",
self.node,
self.span.start(),
self.span.end()
)
}
}