Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. use std::collections::VecDeque;
  2.  
  3. pub struct LookAheadIterator<I: Iterator> {
  4. iter: I,
  5. pos: usize,
  6. look_ahead_count: usize,
  7. is_done: bool,
  8. look_ahead_items: VecDeque<Option<I::Item>>,
  9. previous: Option<I::Item>,
  10. }
  11.  
  12. impl<I: Iterator> LookAheadIterator<I> {
  13. pub fn new(iter: I) -> LookAheadIterator<I> {
  14. LookAheadIterator {
  15. iter,
  16. pos: 0,
  17. look_ahead_count: 0,
  18. is_done: false,
  19. look_ahead_items: VecDeque::new(),
  20. previous: None,
  21. }
  22. }
  23.  
  24. pub fn pos(&self) -> usize {
  25. self.pos
  26. }
  27.  
  28. fn peek_n(&mut self, n: usize) -> Option<&I::Item> {
  29. if self.is_done && n >= self.look_ahead_count {
  30. None.as_ref()
  31. } else if self.look_ahead_count >= n {
  32. self.look_ahead_items.get(n - 1).unwrap().as_ref()
  33. } else {
  34. let mut item;
  35. let mut c = self.look_ahead_count;
  36. while c < n {
  37. item = self.iter.next();
  38. c += 1;
  39.  
  40. if item.is_none() {
  41. self.is_done = true;
  42.  
  43. return None.as_ref();
  44. } else {
  45. self.look_ahead_count += 1;
  46. self.look_ahead_items.push_back(item);
  47. }
  48. }
  49.  
  50. self.peek_n(n)
  51. }
  52. }
  53.  
  54. pub fn next(&mut self) -> Option<I::Item> {
  55. /*
  56. if self.pos > 0 {
  57. self.previous = *self.peek();
  58. }*/
  59.  
  60. if self.look_ahead_count > 0 {
  61. self.look_ahead_count -= 1;
  62. self.pos += 1;
  63. self.look_ahead_items.pop_front().unwrap()
  64. } else {
  65. let item = self.iter.next();
  66.  
  67. if item.is_some() {
  68. self.pos += 1;
  69. }
  70.  
  71. item
  72. }
  73. }
  74.  
  75. pub fn peek(&mut self) -> Option<&I::Item> {
  76. self.peek_n(1)
  77. }
  78.  
  79. pub fn peek_next(&mut self) -> Option<&I::Item> {
  80. self.peek_n(2)
  81. }
  82. }
  83.  
  84. fn main() {
  85.  
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement