diff options
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -1,4 +1,11 @@ -use core::{cmp::PartialEq, fmt, iter::Iterator, marker::Sized, ops::Range}; +use core::{ + clone::Clone, + cmp::PartialEq, + fmt, + iter::{IntoIterator, Iterator}, + marker::Sized, + ops::Range, +}; use crate::{ input::{Character, Input, InputIter}, @@ -427,7 +434,7 @@ impl<I, It> Parser<I> for OneOf<It> where I: Input, I::Item: PartialEq<It::Item>, - It: Iterator, + It: IntoIterator + Clone, { type Output = I::Item; @@ -437,9 +444,13 @@ where ) -> ParserResult<I, Self::Output, OM, EM> { Tracer::trace("oneof", it.clone()); + let start = it.clone(); + match it.next() { - Some((_, item)) if self.it.any(|i| item == i) => Ok((it, OM::bind(|| item))), - _ => Err(EM::bind(|| it)), + Some((_, item)) if self.it.clone().into_iter().any(|i| item == i) => { + Ok((it, OM::bind(|| item))) + } + _ => Err(EM::bind(|| start)), } } } @@ -448,7 +459,7 @@ pub fn one_of<I, It>(it: It) -> impl Parser<I, Output = I::Item> where I: Input, I::Item: PartialEq<It::Item>, - It: Iterator, + It: IntoIterator + Clone, { OneOf { it } } |
