Skip to main content

drias/span/
multi.rs

1use crate::span::{Span, AsSpan};
2
3#[derive(Clone)]
4pub struct MultiSpan(Vec<Span>);
5
6impl MultiSpan {
7    pub fn new(spans: Vec<Span>) -> Self {
8        Self(spans)
9    }
10
11    pub fn one(span: Span) -> Self {
12        Self(vec![span])
13    }
14
15    pub fn empty() -> Self {
16        Self(Vec::new())
17    }
18
19    pub fn into_spans(self) -> Vec<Span> {
20        self.0
21    }
22
23    pub fn spans(&self) -> &Vec<Span> {
24        &self.0
25    }
26
27    pub fn is_empty(&self) -> bool {
28        self.0.is_empty()
29    }
30}
31
32pub trait AsMultiSpan {
33    fn multi_span(self) -> MultiSpan;
34}
35
36impl AsMultiSpan for MultiSpan {
37    fn multi_span(self) -> MultiSpan {
38        self
39    }
40}
41
42impl AsMultiSpan for () {
43    fn multi_span(self) -> MultiSpan {
44        MultiSpan::empty()
45    }
46}
47
48impl<T: AsSpan> AsMultiSpan for T {
49    fn multi_span(self) -> MultiSpan {
50        MultiSpan::one(self.span())
51    }
52}
53
54impl<T: AsSpan> AsMultiSpan for Vec<T> {
55    fn multi_span(self) -> MultiSpan {
56        MultiSpan::new(self.into_iter().map(|x| x.span()).collect())
57    }
58}