use core::fmt::{self, Debug};
use crate::span::{Span, Spanned};
#[derive(PartialEq, Eq, Clone, Copy)]
#[expect(clippy::exhaustive_structs)]
pub struct Token<T>(
pub T,
pub Span,
);
impl<T> Token<T> {
#[inline(always)]
pub const fn new(data: T, span: Span) -> Self {
Self(data, span)
}
#[inline(always)]
pub const fn data(&self) -> &T {
&self.0
}
#[inline(always)]
pub const fn span(&self) -> &Span {
&self.1
}
#[inline(always)]
pub fn data_mut(&mut self) -> &mut T {
&mut self.0
}
#[inline(always)]
pub fn span_mut(&mut self) -> &mut Span {
&mut self.1
}
#[inline(always)]
pub fn into_data(self) -> T {
self.0
}
#[inline(always)]
pub fn into_span(self) -> Span {
self.1
}
#[inline(always)]
pub fn into_spanned(self) -> Spanned<T> {
self.1.wrap(self.0)
}
#[inline(always)]
pub fn from_spanned(span: Spanned<T>) -> Self {
Self(span.data, span.span)
}
}
impl<T: Debug> Debug for Token<T> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Token")
.field(&(self.1.index()..self.1.end_index()))
.field(&self.0)
.finish()
}
}
impl<T> From<Spanned<T>> for Token<T> {
#[inline]
fn from(value: Spanned<T>) -> Self {
Self::from_spanned(value)
}
}