1use crate::*;
2use core::{fmt::Debug, ops::{Deref, Range}};
3
4#[derive(Debug, Clone)]
6pub struct Span<X> {
7 pub value: X,
8 pub range: Range<usize>,
9}
10
11pub trait ToSpan: Sized {
12 fn span(self, range: core::ops::Range<usize>) -> Span<Self>;
13}
14
15impl<X> ToSpan for X {
16 fn span(self, range: core::ops::Range<usize>) -> Span<Self> {
17 Span { value: self, range }
18 }
19}
20
21impl<X> Span<X> {
22 pub fn map<Y>(self, f: impl FnOnce(X) -> Y) -> Span<Y> {
23 Span { value: f(self.value), range: self.range }
24 }
25}
26
27impl<X> Span<X> {
28 pub fn inner_ref<Y: ?Sized>(&self) -> Span<&Y> where X: AsRef<Y> {
29 Span { value: self.value.as_ref(), range: self.range.clone() }
30 }
31}
32
33impl<X> Deref for Span<X> {
34 type Target = X;
35 fn deref(&self) -> &Self::Target {
36 &self.value
37 }
38}
39
40impl<const GROUP: usize, const ERROR: bool, T> ParseImpl<GROUP, ERROR> for Span<T>
41 where T: ParseImpl<GROUP, ERROR>
42{
43 fn parse_impl(
44 input: &str, end: usize,
45 depth: usize,
46 first: bool,
47 trace: &mut Vec<usize>,
48 stack: &mut Vec<Tag>,
49 ) -> Result<usize, ()> {
50 <T as ParseImpl<GROUP, ERROR>>::parse_impl(input, end, depth, first, trace, stack)
51 }
52}
53
54impl<Extra, T> AstImpl<Extra> for Span<T>
55 where T: AstImpl<Extra>,
56 Extra: Copy,
57{
58 fn ast<'a>(
59 input: &'a str,
60 stack: &'a [Tag],
61 with: Extra
62 ) -> (&'a [Tag], Self) {
63 let range = stack[stack.len()-1].span.clone();
64 let (rest, value) = T::ast(input, stack, with);
65 (rest, Span { value, range })
66 }
67}