Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pub struct NomIterator<I,O> {
- input: Option<I>,
- parser: Box<Fn(I) -> IResult<I,O> + 'static>,
- }
- impl<I,O> NomIterator<I,O> {
- fn new(input: I, parser: Box<Fn(I) -> IResult<I,O> + 'static>) -> NomIterator<I,O> {
- NomIterator {
- input: Some(input),
- parser: parser
- }
- }
- fn return_input(&mut self) -> I {
- self.input.take().unwrap()
- }
- fn to_vec(self) -> (I, Vec<O>) {
- let mut v = Vec::new();
- for o in self {
- v.push(o);
- }
- let i = self.return_input();
- (i, v)
- }
- }
- impl<I,O> Iterator for NomIterator<I,O> {
- type Item = O;
- fn next(&mut self) -> Option<Self::Item> {
- let i = self.input.take().unwrap();
- match (self.parser)(i).ok() {
- None => None,
- Some((i,o)) => {
- self.input = Some(i);
- Some(o)
- }
- }
- }
- }
- impl<I,O> std::iter::FusedIterator for NomIterator<I,O> {}
Add Comment
Please, Sign In to add comment