use std::cmp::max;
use std::iter::FromIterator;
use std::marker::PhantomData;
use std::ops::{Range, RangeFrom, RangeFull, RangeTo};
use crate::primitives::{IntoInner, Primitives};
use crate::types::{Input, ParseResult};
pub trait BoundedRange {
fn parse_many<I: Input, T, E, F, U>(self, _: I, _: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>;
fn skip_many<I: Input, T, E, F>(self, _: I, _: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>;
fn many_till<I: Input, T, E, R, F, U, N, V>(self, _: I, _: R, _: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>;
}
impl BoundedRange for Range<usize> {
#[inline]
fn parse_many<I: Input, T, E, F, U>(self, i: I, f: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
assert!(self.start <= self.end);
run_iter! {
input: i,
parser: f,
state: (usize, usize): (self.start, max(self.start, self.end.saturating_sub(1))),
size_hint(self) {
(self.data.0, Some(self.data.1))
}
next(self) {
pre {
if self.data.1 == 0 {
return None;
}
}
on {
self.data.0 = self.data.0.saturating_sub(1);
self.data.1 -= 1;
}
}
=> result : T {
(s, (0, 0), _, _) => s.ret(result),
(s, (0, _), m, Some(_)) => s.restore(m).ret(result),
(s, (_, _), _, Some(e)) => s.err(e),
(_, _, _, None) => unreachable!(),
}
}
}
#[inline]
fn skip_many<I: Input, T, E, F>(self, mut i: I, mut f: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>,
{
assert!(self.start <= self.end);
let (mut min, mut max) = (self.start, max(self.start, self.end.saturating_sub(1)));
loop {
if max == 0 {
break;
}
let m = i.mark();
match f(i).into_inner() {
(b, Ok(_)) => {
min = min.saturating_sub(1);
max -= 1;
i = b
}
(b, Err(e)) => {
if min == 0 {
i = b.restore(m);
break;
} else {
return b.err(e);
}
}
}
}
i.ret(())
}
#[inline]
fn many_till<I: Input, T, E, R, F, U, N, V>(self, i: I, p: R, end: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
assert!(self.start <= self.end);
run_iter_till! {
input: i,
parser: p,
end: end,
state: (usize, usize): (self.start, max(self.start, self.end.saturating_sub(1))),
size_hint(self) {
(self.data.0, Some(self.data.1))
}
next(self) {
pre {
if self.data.0 == 0 {
let i = self.buf.take().expect("Iter.buf was None");
let m = i.mark();
match (self.data.1, (self.end)(i).into_inner()) {
(_, (b, Ok(_))) => {
self.buf = Some(b);
self.state = EndStateTill::EndSuccess;
return None
},
(0, (b, Err(e))) => {
self.buf = Some(b);
self.state = EndStateTill::Error(From::from(e));
return None;
},
(_, (b, Err(_))) => self.buf = Some(b.restore(m)),
}
}
}
on {
self.data.0 = self.data.0.saturating_sub(1);
self.data.1 -= 1;
}
}
=> result : T {
(s, (0, _), EndStateTill::EndSuccess) => s.ret(result),
(s, (_, _), EndStateTill::Error(e)) => s.err(e),
(_, (_, _), EndStateTill::Incomplete) => unreachable!(),
(_, (_, _), EndStateTill::EndSuccess) => unreachable!()
}
}
}
}
impl BoundedRange for RangeFrom<usize> {
#[inline]
fn parse_many<I: Input, T, E, F, U>(self, i: I, f: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
run_iter! {
input: i,
parser: f,
state: usize: self.start,
size_hint(self) {
(self.data, None)
}
next(self) {
pre {}
on {
self.data = self.data.saturating_sub(1);
}
}
=> result : T {
(s, 0, m, Some(_)) => s.restore(m).ret(result),
(s, _, _, Some(e)) => s.err(e),
(_, _, _, None) => unreachable!(),
}
}
}
#[inline]
fn skip_many<I: Input, T, E, F>(self, mut i: I, mut f: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>,
{
let mut min = self.start;
loop {
let m = i.mark();
match f(i).into_inner() {
(b, Ok(_)) => {
min = min.saturating_sub(1);
i = b
}
(b, Err(e)) => {
if min == 0 {
i = b.restore(m);
break;
} else {
return b.err(e);
}
}
}
}
i.ret(())
}
#[inline]
fn many_till<I: Input, T, E, R, F, U, N, V>(self, i: I, p: R, end: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
run_iter_till! {
input: i,
parser: p,
end: end,
state: usize: self.start,
size_hint(self) {
(self.data, None)
}
next(self) {
pre {
if self.data == 0 {
iter_till_end_test!(self);
}
}
on {
self.data = self.data.saturating_sub(1);
}
}
=> result : T {
(s, 0, EndStateTill::EndSuccess) => s.ret(result),
(s, _, EndStateTill::Error(e)) => s.err(e),
(_, _, EndStateTill::Incomplete) => unreachable!(),
(_, _, EndStateTill::EndSuccess) => unreachable!()
}
}
}
}
impl BoundedRange for RangeFull {
#[inline]
fn parse_many<I: Input, T, E, F, U>(self, i: I, f: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
run_iter! {
input: i,
parser: f,
state: (): (),
size_hint(self) {
(0, None)
}
next(self) {
pre {}
on {}
}
=> result : T {
(s, (), m, Some(_)) => s.restore(m).ret(result),
(_, _, _, None) => unreachable!(),
}
}
}
#[inline]
fn skip_many<I: Input, T, E, F>(self, mut i: I, mut f: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>,
{
loop {
let m = i.mark();
match f(i).into_inner() {
(b, Ok(_)) => i = b,
(b, Err(_)) => {
i = b.restore(m);
break;
}
}
}
i.ret(())
}
#[inline]
fn many_till<I: Input, T, E, R, F, U, N, V>(self, i: I, p: R, end: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
run_iter_till! {
input: i,
parser: p,
end: end,
state: (): (),
size_hint(self) {
(0, None)
}
next(self) {
pre {
iter_till_end_test!(self);
}
on {}
}
=> result : T {
(s, (), EndStateTill::EndSuccess) => s.ret(result),
(s, (), EndStateTill::Error(e)) => s.err(e),
(_, (), EndStateTill::Incomplete) => unreachable!()
}
}
}
}
impl BoundedRange for RangeTo<usize> {
#[inline]
fn parse_many<I: Input, T, E, F, U>(self, i: I, f: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
run_iter! {
input: i,
parser: f,
state: usize: max(self.end, 1) - 1,
size_hint(self) {
(0, Some(self.data))
}
next(self) {
pre {
if self.data == 0 {
return None;
}
}
on {
self.data -= 1;
}
}
=> result : T {
(s, 0, _, _) => s.ret(result),
(s, _, m, Some(_)) => s.restore(m).ret(result),
(_, _, _, None) => unreachable!(),
}
}
}
#[inline]
fn skip_many<I: Input, T, E, F>(self, mut i: I, mut f: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>,
{
let mut max = max(self.end, 1) - 1;
loop {
if max == 0 {
break;
}
let m = i.mark();
match f(i).into_inner() {
(b, Ok(_)) => {
max -= 1;
i = b
}
(b, Err(_)) => {
i = b.restore(m);
break;
}
}
}
i.ret(())
}
#[inline]
fn many_till<I: Input, T, E, R, F, U, N, V>(self, i: I, p: R, end: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
run_iter_till! {
input: i,
parser: p,
end: end,
state: usize: max(self.end, 1) - 1,
size_hint(self) {
(0, Some(self.data))
}
next(self) {
pre {
let i = self.buf.take().expect("Iter.buf was None");
let m = i.mark();
match (self.data, (self.end)(i).into_inner()) {
(_, (b, Ok(_))) => {
self.buf = Some(b);
self.state = EndStateTill::EndSuccess;
return None
},
(0, (b, Err(e))) => {
self.buf = Some(b);
self.state = EndStateTill::Error(From::from(e));
return None;
},
(_, (b, Err(_))) => self.buf = Some(b.restore(m)),
}
}
on {
self.data -= 1;
}
}
=> result : T {
(s, _, EndStateTill::EndSuccess) => s.ret(result),
(s, _, EndStateTill::Error(e)) => s.err(e),
(_, _, EndStateTill::Incomplete) => unreachable!(),
}
}
}
}
impl BoundedRange for usize {
#[inline]
fn parse_many<I: Input, T, E, F, U>(self, i: I, f: F) -> ParseResult<I, T, E>
where
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
run_iter! {
input: i,
parser: f,
state: usize: self,
size_hint(self) {
(self.data, Some(self.data))
}
next(self) {
pre {
if self.data == 0 {
return None;
}
}
on {
self.data -= 1;
}
}
=> result : T {
(s, 0, _, _) => s.ret(result),
(s, _, _, Some(e)) => s.err(e),
(_, _, _, None) => unreachable!(),
}
}
}
#[inline]
fn skip_many<I: Input, T, E, F>(self, mut i: I, mut f: F) -> ParseResult<I, (), E>
where
F: FnMut(I) -> ParseResult<I, T, E>,
{
let mut n = self;
loop {
if n == 0 {
break;
}
match f(i).into_inner() {
(b, Ok(_)) => {
n -= 1;
i = b
}
(b, Err(e)) => {
if n == 0 {
unreachable!();
} else {
return b.err(e);
}
}
}
}
i.ret(())
}
#[inline]
fn many_till<I: Input, T, E, R, F, U, N, V>(self, i: I, p: R, end: F) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
run_iter_till! {
input: i,
parser: p,
end: end,
state: usize: self,
size_hint(self) {
(self.data, Some(self.data))
}
next(self) {
pre {
if self.data == 0 {
let i = self.buf.take().expect("Iter.buf was None");
match (self.end)(i).into_inner() {
(b, Ok(_)) => {
self.buf = Some(b);
self.state = EndStateTill::EndSuccess;
},
(b, Err(e)) => {
self.buf = Some(b);
self.state = EndStateTill::Error(From::from(e));
},
}
return None;
}
}
on {
self.data -= 1;
}
}
=> result : T {
(s, 0, EndStateTill::EndSuccess) => s.ret(result),
(s, _, EndStateTill::Error(e)) => s.err(e),
(_, _, EndStateTill::Incomplete) => unreachable!(),
(_, _, EndStateTill::EndSuccess) => unreachable!()
}
}
}
}
#[inline]
pub fn many<I: Input, T, E, F, U, R>(i: I, r: R, f: F) -> ParseResult<I, T, E>
where
R: BoundedRange,
F: FnMut(I) -> ParseResult<I, U, E>,
T: FromIterator<U>,
{
BoundedRange::parse_many(r, i, f)
}
#[inline]
pub fn skip_many<I: Input, T, E, F, R>(i: I, r: R, f: F) -> ParseResult<I, (), E>
where
R: BoundedRange,
F: FnMut(I) -> ParseResult<I, T, E>,
{
BoundedRange::skip_many(r, i, f)
}
#[inline]
pub fn many_till<I: Input, T, E, R, F, U, N, P, V>(i: I, r: R, p: P, end: F) -> ParseResult<I, T, E>
where
R: BoundedRange,
T: FromIterator<U>,
E: From<N>,
P: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
BoundedRange::many_till(r, i, p, end)
}
#[inline]
pub fn sep_by<I: Input, T, E, R, F, U, N, P, V>(
i: I,
r: R,
mut p: P,
mut sep: F,
) -> ParseResult<I, T, E>
where
T: FromIterator<U>,
E: From<N>,
R: BoundedRange,
P: FnMut(I) -> ParseResult<I, U, E>,
F: FnMut(I) -> ParseResult<I, V, N>,
{
let mut item = false;
let parser = |i| {
(if item { sep(i).map(|_| ()) } else { i.ret(()) })
.then(&mut p)
.inspect(|_| item = true)
};
BoundedRange::parse_many(r, i, parser)
}
#[cfg(test)]
mod test {
use super::{many, many_till, skip_many};
use crate::parsers::{any, string, token, Error};
use crate::primitives::IntoInner;
use crate::types::ParseResult;
#[test]
fn many_range_full() {
let r: ParseResult<_, Vec<_>, _> = many(&b"b"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"ab"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aab"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], .., any);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], .., any);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], .., any);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], .., |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"ac"[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], .., |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"ac"[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aba"[..], .., |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![&b"ab"[..]])));
}
#[test]
fn many_range_to() {
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], ..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], ..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], ..1, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], ..1, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaa"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], ..3, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"ac"[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], ..3, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"ac"[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aba"[..], ..3, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![&b"ab"[..]])));
}
#[test]
fn many_range_from() {
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaa"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"b"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"ab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"ababac"[..], 2.., |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"ac"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
let r: ParseResult<_, Vec<_>, _> = many(&b"ababac"[..], 2.., |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"ac"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
let r: ParseResult<_, Vec<_>, _> = many(&b"ababa"[..], 2.., |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"a"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
}
#[test]
fn many_range() {
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaa"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaaa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"b"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"ab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaaab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(vec![b'a', b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], 1..3, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"ac"[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many(&b"ababac"[..], 1..3, |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"ac"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
}
#[test]
fn many_exact() {
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], 0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"aa"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many(&b""[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"a"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aa"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaa"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"b"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"ab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"aab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"aaab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(vec![b'a', b'a'])));
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], 2, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"ababa"[..], 2, |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"a"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
let r: ParseResult<_, Vec<_>, _> = many(&b"abac"[..], 2, |i| string(i, b"ab"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many(&b"ababac"[..], 2, |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"ac"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
let r: ParseResult<_, Vec<_>, _> = many(&b"ababa"[..], 2, |i| string(i, b"ab"));
assert_eq!(
r.into_inner(),
(&b"a"[..], Ok(vec![&b"ab"[..], &b"ab"[..]]))
);
}
#[test]
fn many_till_range_full() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], .., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], .., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abac"[..], .., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababab"[..],
..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababa"[..],
..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
}
#[test]
fn many_till_range_from() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0.., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 0.., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ab"[..], 0.., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0.., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 1.., |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
0..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
1..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
2..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
2..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababab"[..],
2..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababa"[..],
2..,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
}
#[test]
fn many_till_range_to() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], ..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"b"[..], ..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], ..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], ..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], ..1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], ..1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
..2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], ..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], ..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababac"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"bac"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababab"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababa"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababa"[..],
..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"ba"[..], Err(Error::expected(b'c'))));
}
#[test]
fn many_till_range() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0..0, |i| string(i, b"ab"), |i| string(i, b"cd"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 0..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0..0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0..1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0..1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ab"[..], 0..1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
0..1,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"bac"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0..2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
0..2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 0..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abc"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababac"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"bac"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababa"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababa"[..],
0..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"ba"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 1..3, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
1..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abac"[..],
2..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
2..3,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
2..2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
}
#[test]
fn many_till_exact() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"aca"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"acab"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(vec![])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ab"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abac"[..], 0, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"bac"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ab"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"aba"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abab"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abac"[..], 1, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b""[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"a"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ac"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ab"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"aba"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abab"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"abac"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b"c"[..], Err(Error::expected(b'b'))));
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"ababa"[..], 2, |i| string(i, b"ab"), |i| string(i, b"ac"));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababac"[..],
2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b""[..], Ok(vec![&b"ab"[..], &b"ab"[..]])));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"ababab"[..],
2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'c'))));
let r: ParseResult<_, Vec<_>, _> = many_till(
&b"abababac"[..],
2,
|i| string(i, b"ab"),
|i| string(i, b"ac"),
);
assert_eq!(r.into_inner(), (&b"bac"[..], Err(Error::expected(b'c'))));
}
#[test]
fn skip_range_full() {
let r = skip_many(&b""[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"a"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aa"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"b"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"ab"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aab"[..], .., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
}
#[test]
fn skip_range_to() {
let r = skip_many(&b""[..], ..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"b"[..], ..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"a"[..], ..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b""[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"a"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aa"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaa"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b"b"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"ab"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aab"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aaab"[..], ..3, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(())));
}
#[test]
fn skip_range_from() {
let r = skip_many(&b""[..], 0.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"a"[..], 0.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aa"[..], 0.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b""[..], 1.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 0.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b""[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aa"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaa"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"b"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"ab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aaab"[..], 2.., |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
}
#[test]
fn skip_range() {
let r = skip_many(&b""[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"a"[..], 0..0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b""[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aa"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaa"[..], 2..2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b""[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaaa"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b"b"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"ab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aaab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"aaaab"[..], 2..4, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(())));
}
#[test]
fn skip_exact() {
let r = skip_many(&b""[..], 0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"a"[..], 0, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b""[..], 1, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 1, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b""[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"a"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"aa"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b""[..], Ok(())));
let r = skip_many(&b"aaa"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"a"[..], Ok(())));
let r = skip_many(&b"aaab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(())));
let r = skip_many(&b"aab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Ok(())));
let r = skip_many(&b"ab"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
let r = skip_many(&b"b"[..], 2, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"b"[..], Err(Error::expected(b'a'))));
}
#[test]
#[should_panic]
fn panic_many_range_lt() {
let r: ParseResult<_, Vec<_>, _> = many(&b"aaaab"[..], 2..1, |i| token(i, b'a'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(vec![b'a', b'a', b'a'])));
}
#[test]
#[should_panic]
fn panic_skip_many_range_lt() {
assert_eq!(
skip_many(&b"aaaab"[..], 2..1, |i| token(i, b'a')).into_inner(),
(&b"ab"[..], Ok(()))
);
}
#[test]
#[should_panic]
fn panic_many_till_range_lt() {
let r: ParseResult<_, Vec<_>, _> =
many_till(&b"aaaab"[..], 2..1, |i| token(i, b'a'), |i| token(i, b'b'));
assert_eq!(r.into_inner(), (&b"ab"[..], Ok(vec![b'a', b'a', b'a'])));
}
}