158 lines
4.1 KiB
Rust
158 lines
4.1 KiB
Rust
use crate::lib::marker::PhantomData;
|
|
|
|
use crate::{
|
|
error::{ParseErrorInto, ParseResult, StreamErrorInto},
|
|
stream::{ResetStream, StreamErrorFor},
|
|
Positioned, RangeStream, RangeStreamOnce, StreamOnce,
|
|
};
|
|
|
|
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
pub struct Span<P> {
|
|
pub start: P,
|
|
pub end: P,
|
|
}
|
|
|
|
impl<P> From<P> for Span<P>
|
|
where
|
|
P: Clone,
|
|
{
|
|
#[inline]
|
|
fn from(p: P) -> Self {
|
|
Self {
|
|
start: p.clone(),
|
|
end: p,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<P> Span<P> {
|
|
pub fn map<Q>(self, mut f: impl FnMut(P) -> Q) -> Span<Q> {
|
|
Span {
|
|
start: f(self.start),
|
|
end: f(self.end),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
|
|
pub struct Stream<S, E>(pub S, PhantomData<fn(E) -> E>);
|
|
|
|
impl<S, E> From<S> for Stream<S, E> {
|
|
fn from(stream: S) -> Self {
|
|
Stream(stream, PhantomData)
|
|
}
|
|
}
|
|
|
|
impl<S, E> ResetStream for Stream<S, E>
|
|
where
|
|
S: ResetStream + Positioned,
|
|
S::Token: PartialEq,
|
|
S::Range: PartialEq,
|
|
E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
|
|
S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
|
|
<S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
|
|
StreamErrorInto<S::Token, S::Range>,
|
|
{
|
|
type Checkpoint = S::Checkpoint;
|
|
|
|
#[inline]
|
|
fn checkpoint(&self) -> Self::Checkpoint {
|
|
self.0.checkpoint()
|
|
}
|
|
|
|
#[inline]
|
|
fn reset(&mut self, checkpoint: Self::Checkpoint) -> Result<(), Self::Error> {
|
|
self.0
|
|
.reset(checkpoint)
|
|
.map_err(ParseErrorInto::into_other_error)
|
|
}
|
|
}
|
|
|
|
impl<S, E> StreamOnce for Stream<S, E>
|
|
where
|
|
S: StreamOnce + Positioned,
|
|
S::Token: PartialEq,
|
|
S::Range: PartialEq,
|
|
E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
|
|
S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
|
|
<S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
|
|
StreamErrorInto<S::Token, S::Range>,
|
|
{
|
|
type Token = S::Token;
|
|
type Range = S::Range;
|
|
type Position = Span<S::Position>;
|
|
type Error = E;
|
|
|
|
#[inline]
|
|
fn uncons(&mut self) -> Result<Self::Token, StreamErrorFor<Self>> {
|
|
self.0.uncons().map_err(StreamErrorInto::into_other_error)
|
|
}
|
|
|
|
#[inline]
|
|
fn is_partial(&self) -> bool {
|
|
self.0.is_partial()
|
|
}
|
|
}
|
|
|
|
impl<S, E> RangeStreamOnce for Stream<S, E>
|
|
where
|
|
S: RangeStream,
|
|
S::Token: PartialEq,
|
|
S::Range: PartialEq,
|
|
E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
|
|
S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
|
|
<S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
|
|
StreamErrorInto<S::Token, S::Range>,
|
|
{
|
|
#[inline]
|
|
fn uncons_range(&mut self, size: usize) -> Result<Self::Range, StreamErrorFor<Self>> {
|
|
self.0
|
|
.uncons_range(size)
|
|
.map_err(StreamErrorInto::into_other_error)
|
|
}
|
|
|
|
#[inline]
|
|
fn uncons_while<F>(&mut self, f: F) -> Result<Self::Range, StreamErrorFor<Self>>
|
|
where
|
|
F: FnMut(Self::Token) -> bool,
|
|
{
|
|
self.0
|
|
.uncons_while(f)
|
|
.map_err(StreamErrorInto::into_other_error)
|
|
}
|
|
|
|
#[inline]
|
|
fn uncons_while1<F>(&mut self, f: F) -> ParseResult<Self::Range, StreamErrorFor<Self>>
|
|
where
|
|
F: FnMut(Self::Token) -> bool,
|
|
{
|
|
self.0
|
|
.uncons_while1(f)
|
|
.map_err(StreamErrorInto::into_other_error)
|
|
}
|
|
|
|
#[inline]
|
|
fn distance(&self, end: &Self::Checkpoint) -> usize {
|
|
self.0.distance(end)
|
|
}
|
|
|
|
fn range(&self) -> Self::Range {
|
|
self.0.range()
|
|
}
|
|
}
|
|
|
|
impl<S, E> Positioned for Stream<S, E>
|
|
where
|
|
S: StreamOnce + Positioned,
|
|
S::Token: PartialEq,
|
|
S::Range: PartialEq,
|
|
E: crate::error::ParseError<S::Token, S::Range, Span<S::Position>>,
|
|
S::Error: ParseErrorInto<S::Token, S::Range, S::Position>,
|
|
<S::Error as crate::error::ParseError<S::Token, S::Range, S::Position>>::StreamError:
|
|
StreamErrorInto<S::Token, S::Range>,
|
|
{
|
|
fn position(&self) -> Span<S::Position> {
|
|
Span::from(self.0.position())
|
|
}
|
|
}
|