combine/stream/
span.rs

1use crate::lib::marker::PhantomData;
2
3use crate::{
4    error::{ParseErrorInto, ParseResult, StreamErrorInto},
5    stream::{ResetStream, StreamErrorFor},
6    Positioned, RangeStream, RangeStreamOnce, StreamOnce,
7};
8
9#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
10pub struct Span<P> {
11    pub start: P,
12    pub end: P,
13}
14
15impl<P> From<P> for Span<P>
16where
17    P: Clone,
18{
19    #[inline]
20    fn from(p: P) -> Self {
21        Self {
22            start: p.clone(),
23            end: p,
24        }
25    }
26}
27
28impl<P> Span<P> {
29    pub fn map<Q>(self, mut f: impl FnMut(P) -> Q) -> Span<Q> {
30        Span {
31            start: f(self.start),
32            end: f(self.end),
33        }
34    }
35}
36
37#[derive(PartialEq, Eq, Copy, Clone, Debug)]
38pub struct Stream<S, E>(pub S, PhantomData<fn(E) -> E>);
39
40impl<S, E> From<S> for Stream<S, E> {
41    fn from(stream: S) -> Self {
42        Stream(stream, PhantomData)
43    }
44}
45
46impl<S, E> ResetStream for Stream<S, E>
47where
48    S: ResetStream + Positioned,
49    S::Token: PartialEq,
50    S::Range: PartialEq,
51    E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
52    S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
53    <S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
54        StreamErrorInto<S::Token, S::Range>,
55{
56    type Checkpoint = S::Checkpoint;
57
58    #[inline]
59    fn checkpoint(&self) -> Self::Checkpoint {
60        self.0.checkpoint()
61    }
62
63    #[inline]
64    fn reset(&mut self, checkpoint: Self::Checkpoint) -> Result<(), Self::Error> {
65        self.0
66            .reset(checkpoint)
67            .map_err(ParseErrorInto::into_other_error)
68    }
69}
70
71impl<S, E> StreamOnce for Stream<S, E>
72where
73    S: StreamOnce + Positioned,
74    S::Token: PartialEq,
75    S::Range: PartialEq,
76    E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
77    S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
78    <S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
79        StreamErrorInto<S::Token, S::Range>,
80{
81    type Token = S::Token;
82    type Range = S::Range;
83    type Position = Span<S::Position>;
84    type Error = E;
85
86    #[inline]
87    fn uncons(&mut self) -> Result<Self::Token, StreamErrorFor<Self>> {
88        self.0.uncons().map_err(StreamErrorInto::into_other_error)
89    }
90
91    #[inline]
92    fn is_partial(&self) -> bool {
93        self.0.is_partial()
94    }
95}
96
97impl<S, E> RangeStreamOnce for Stream<S, E>
98where
99    S: RangeStream,
100    S::Token: PartialEq,
101    S::Range: PartialEq,
102    E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
103    S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
104    <S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
105        StreamErrorInto<S::Token, S::Range>,
106{
107    #[inline]
108    fn uncons_range(&mut self, size: usize) -> Result<Self::Range, StreamErrorFor<Self>> {
109        self.0
110            .uncons_range(size)
111            .map_err(StreamErrorInto::into_other_error)
112    }
113
114    #[inline]
115    fn uncons_while<F>(&mut self, f: F) -> Result<Self::Range, StreamErrorFor<Self>>
116    where
117        F: FnMut(Self::Token) -> bool,
118    {
119        self.0
120            .uncons_while(f)
121            .map_err(StreamErrorInto::into_other_error)
122    }
123
124    #[inline]
125    fn uncons_while1<F>(&mut self, f: F) -> ParseResult<Self::Range, StreamErrorFor<Self>>
126    where
127        F: FnMut(Self::Token) -> bool,
128    {
129        self.0
130            .uncons_while1(f)
131            .map_err(StreamErrorInto::into_other_error)
132    }
133
134    #[inline]
135    fn distance(&self, end: &Self::Checkpoint) -> usize {
136        self.0.distance(end)
137    }
138
139    fn range(&self) -> Self::Range {
140        self.0.range()
141    }
142}
143
144impl<S, E> Positioned for Stream<S, E>
145where
146    S: StreamOnce + Positioned,
147    S::Token: PartialEq,
148    S::Range: PartialEq,
149    E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
150    S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
151    <S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
152        StreamErrorInto<S::Token, S::Range>,
153{
154    fn position(&self) -> Span<S::Position> {
155        Span::from(self.0.position())
156    }
157}