1use std::ops::Range;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
7pub struct Span {
8 pub start: usize,
9 pub end: usize,
10}
11
12impl Span {
13 pub fn new(start: usize, end: usize) -> Self {
14 Self { start, end }
15 }
16
17 pub fn merge(self, other: Span) -> Span {
18 Span {
19 start: self.start.min(other.start),
20 end: self.end.max(other.end),
21 }
22 }
23
24 pub fn to_range(self) -> Range<usize> {
25 self.start..self.end
26 }
27}
28
29impl From<Range<usize>> for Span {
30 fn from(range: Range<usize>) -> Self {
31 Span::new(range.start, range.end)
32 }
33}
34
35impl From<Span> for Range<usize> {
36 fn from(span: Span) -> Self {
37 span.to_range()
38 }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq)]
43pub struct Spanned<T> {
44 pub value: T,
45 pub span: Span,
46}
47
48impl<T> Spanned<T> {
49 pub fn new(value: T, span: Span) -> Self {
50 Self { value, span }
51 }
52
53 pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Spanned<U> {
54 Spanned {
55 value: f(self.value),
56 span: self.span,
57 }
58 }
59}
60