1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
7pub struct Span {
8 pub start: usize,
10 pub end: usize,
12}
13
14impl Span {
15 pub fn new(start: usize, end: usize) -> Self {
17 Self { start, end }
18 }
19
20 pub fn dummy() -> Self {
22 Self { start: 0, end: 0 }
23 }
24
25 pub fn merge(self, other: Span) -> Span {
27 Span {
28 start: self.start.min(other.start),
29 end: self.end.max(other.end),
30 }
31 }
32
33 pub fn len(&self) -> usize {
35 self.end - self.start
36 }
37
38 pub fn is_empty(&self) -> bool {
40 self.start == self.end
41 }
42
43 pub fn is_dummy(&self) -> bool {
45 self.start == 0 && self.end == 0
46 }
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
51pub struct Spanned<T> {
52 pub value: T,
53 pub span: Span,
54}
55
56impl<T> Spanned<T> {
57 pub fn new(value: T, span: Span) -> Self {
58 Self { value, span }
59 }
60
61 pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Spanned<U> {
62 Spanned {
63 value: f(self.value),
64 span: self.span,
65 }
66 }
67}
68
69impl<T> std::ops::Deref for Spanned<T> {
70 type Target = T;
71
72 fn deref(&self) -> &Self::Target {
73 &self.value
74 }
75}