use chumsky::span::SimpleSpan as SourceSpan;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Spanned<T> {
pub value: T,
pub span: SourceSpan,
}
pub trait WithSpan
where
Self: Sized,
{
fn with_span(self, span: SourceSpan) -> Spanned<Self> {
Spanned { value: self, span }
}
fn with_empty_span(self) -> Spanned<Self> {
self.with_span((0..0).into())
}
}
#[cfg(feature = "serde")]
impl<T: serde::Serialize> serde::Serialize for Spanned<T> {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.value.serialize(serializer)
}
}
impl<T> Spanned<T> {
pub fn new(value: T, span: SourceSpan) -> Self {
Self { value, span }
}
pub fn map(self, f: impl FnOnce(T) -> T) -> Self {
Self {
value: f(self.value),
span: self.span,
}
}
}
#[cfg(test)]
mod tests {
}