Guest User

Untitled

a guest
Apr 22nd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.85 KB | None | 0 0
  1. pub struct NomIterator<I,O> {
  2. input: Option<I>,
  3. parser: Box<Fn(I) -> IResult<I,O> + 'static>,
  4. }
  5.  
  6. impl<I,O> NomIterator<I,O> {
  7. fn new(input: I, parser: Box<Fn(I) -> IResult<I,O> + 'static>) -> NomIterator<I,O> {
  8. NomIterator {
  9. input: Some(input),
  10. parser: parser
  11. }
  12. }
  13.  
  14. fn return_input(&mut self) -> I {
  15. self.input.take().unwrap()
  16. }
  17.  
  18. fn to_vec(self) -> (I, Vec<O>) {
  19. let mut v = Vec::new();
  20. for o in self {
  21. v.push(o);
  22. }
  23.  
  24. let i = self.return_input();
  25. (i, v)
  26. }
  27. }
  28.  
  29. impl<I,O> Iterator for NomIterator<I,O> {
  30. type Item = O;
  31.  
  32. fn next(&mut self) -> Option<Self::Item> {
  33. let i = self.input.take().unwrap();
  34. match (self.parser)(i).ok() {
  35. None => None,
  36. Some((i,o)) => {
  37. self.input = Some(i);
  38. Some(o)
  39. }
  40. }
  41. }
  42. }
  43.  
  44. impl<I,O> std::iter::FusedIterator for NomIterator<I,O> {}
Add Comment
Please, Sign In to add comment