1use std::ops::Range;
2
3use derive_more::derive::{AsMut, AsRef, Deref, DerefMut, From};
4
5pub type Id = u32;
6
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[derive(Default, Clone, Debug, PartialEq, Eq, Deref, DerefMut, AsRef, AsMut, From)]
9pub struct Span(Range<usize>);
10
11impl Span {
12 pub fn new(range: Range<usize>) -> Self {
13 Self(range)
14 }
15 pub fn range(&self) -> Range<usize> {
16 self.0.clone()
17 }
18 pub fn extend(&self, other: &Span) -> Self {
19 Self(self.start..other.end)
20 }
21}
22
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[derive(Default, Clone, Debug, Deref, DerefMut, AsRef, AsMut, From)]
25pub struct Spanned<T> {
26 span: Span,
27 #[deref(forward)]
28 #[deref_mut(forward)]
29 #[as_ref(T)]
30 #[as_mut(T)]
31 #[from(T)]
32 node: Box<T>,
33}
34
35impl<T: PartialEq> PartialEq for Spanned<T> {
37 fn eq(&self, other: &Self) -> bool {
38 self.node.eq(&other.node)
39 }
40}
41
42impl<T> Spanned<T> {
43 pub fn new(node: T, span: Span) -> Self {
44 Self::new_boxed(Box::new(node), span)
45 }
46 pub fn new_boxed(node: Box<T>, span: Span) -> Self {
47 Self { span, node }
48 }
49 pub fn span(&self) -> &Span {
50 &self.span
51 }
52 pub fn node(&self) -> &T {
53 self
54 }
55 pub fn node_mut(&mut self) -> &mut T {
56 self
57 }
58 pub fn into_inner(self) -> T {
59 *self.node
60 }
61}
62
63impl<T> From<T> for Spanned<T> {
64 fn from(value: T) -> Self {
65 Self {
66 span: Default::default(),
67 node: Box::new(value),
68 }
69 }
70}