use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
pub const fn new(start: usize, end: usize) -> Self {
Self { start, end }
}
pub fn merge(self, other: Self) -> Self {
Self {
start: self.start.min(other.start),
end: self.end.max(other.end),
}
}
pub const fn dummy() -> Self {
Self { start: 0, end: 0 }
}
}
impl Default for Span {
fn default() -> Self {
Self::dummy()
}
}
impl From<Span> for miette::SourceSpan {
fn from(span: Span) -> Self {
miette::SourceSpan::new(span.start.into(), span.end.saturating_sub(span.start))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "T: Serialize + for<'a> Deserialize<'a>")]
pub struct Spanned<T> {
pub node: T,
pub span: Span,
}
impl<T> Spanned<T> {
pub const fn new(node: T, span: Span) -> Self {
Self { node, span }
}
pub const fn dummy(node: T) -> Self {
Self {
node,
span: Span::dummy(),
}
}
pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Spanned<U> {
Spanned {
node: f(self.node),
span: self.span,
}
}
}