amarok_syntax/
span.rs

1use crate::source_map::FileId;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub struct Span {
5    pub start: usize,
6    pub end: usize,
7    pub file_id: FileId,
8}
9
10impl Span {
11    #[must_use]
12    pub fn new(start: usize, end: usize) -> Self {
13        Self {
14            start,
15            end,
16            file_id: FileId::DUMMY,
17        }
18    }
19
20    #[must_use]
21    pub fn with_file(start: usize, end: usize, file_id: FileId) -> Self {
22        Self {
23            start,
24            end,
25            file_id,
26        }
27    }
28
29    #[must_use]
30    pub fn zero() -> Self {
31        Self {
32            start: 0,
33            end: 0,
34            file_id: FileId::DUMMY,
35        }
36    }
37}
38
39#[derive(Debug, Clone, PartialEq)]
40pub struct Spanned<T> {
41    pub span: Span,
42    pub value: T,
43}
44
45impl<T> Spanned<T> {
46    pub fn new(span: Span, value: T) -> Self {
47        Self { span, value }
48    }
49
50    pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Spanned<U> {
51        Spanned {
52            span: self.span,
53            value: f(self.value),
54        }
55    }
56
57    pub fn with_zero_span(value: T) -> Self {
58        Self {
59            span: Span::zero(),
60            value,
61        }
62    }
63}
64
65impl<T> From<T> for Spanned<T> {
66    fn from(value: T) -> Self {
67        Spanned::with_zero_span(value)
68    }
69}