use std::marker::PhantomData;
use std::iter::FromIterator;
use std::ops::{
Range,
RangeFrom,
RangeFull,
RangeTo,
};
use std::cmp::max;
use types::{Input, ParseResult};
use primitives::{Primitives, IntoInner};
pub trait BoundedRange {
#[inline]
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>;
#[inline]
fn skip_many<I: Input, T, E, F>(self, I, F) -> ParseResult<I, (), E>
where F: FnMut(I) -> ParseResult<I, T, E>;
#[inline]
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 types::ParseResult;
use parsers::{Error, any, token, string};
use primitives::IntoInner;
use super::{
many,
many_till,
skip_many,
};
#[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'])));
}
}