#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Pos { pub line: usize, pub column: usize, pub offset: usize, } impl Pos { pub fn new(line: usize, column: usize, offset: usize) -> Self { Self { line, column, offset, } } } #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Span { pub start: Pos, pub end: Pos, } impl Span { pub fn new(start: Pos, end: Pos) -> Self { Self { start, end } } } #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Spanned { pub inner: T, pub span: Span, } impl Spanned { pub fn new(inner: T, span: Span) -> Self { Self { inner, span } } pub fn into_parts(self) -> (T, Span) { (self.inner, self.span) } pub fn map(self, f: impl FnOnce(T) -> U) -> Spanned { let Self { inner, span } = self; Spanned { inner: f(inner), span, } } }