Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. use std::collections::VecDeque;
  2.  
  3. pub struct Restorable<T, I>
  4. where
  5. T: Iterator<Item = I>,
  6. I: Clone
  7. {
  8. iterator: T,
  9. buf: VecDeque<Option<I>>,
  10. saving: bool,
  11. }
  12.  
  13. impl<T, I> Restorable<T, I>
  14. where
  15. T: Iterator<Item = I>,
  16. I: Clone
  17. {
  18. fn from(iterator: T) -> Self {
  19. Restorable {
  20. iterator,
  21. buf: VecDeque::with_capacity(4),
  22. saving: false
  23. }
  24. }
  25.  
  26. pub fn save(&mut self) {
  27. self.saving = true;
  28. }
  29.  
  30. pub fn restore(&mut self) {
  31. self.saving = false;
  32. }
  33. }
  34.  
  35. impl<T, I> Iterator for Restorable<T, I>
  36. where
  37. T: Iterator<Item = I>,
  38. I: Clone
  39. {
  40. type Item = I;
  41.  
  42. fn next(&mut self) -> Option<Self::Item> {
  43. if self.saving {
  44. let next_item = self.iterator.next();
  45. self.buf.push_back(next_item.clone());
  46. next_item
  47. } else {
  48. match self.buf.pop_front() {
  49. Some(saved_item) => saved_item,
  50. None => self.iterator.next()
  51. }
  52. }
  53. }
  54. }
  55.  
  56. fn main() {
  57. let mut iterator = Restorable::from(0..8);
  58. println!("{:?}", iterator.next());
  59. println!("{:?}", iterator.next());
  60. println!("{:?}", iterator.next());
  61. iterator.save();
  62. println!("{:?}", iterator.next());
  63. println!("{:?}", iterator.next());
  64. println!("{:?}", iterator.next());
  65. iterator.restore();
  66. println!("{:?}", iterator.next());
  67. println!("{:?}", iterator.next());
  68. println!("{:?}", iterator.next());
  69. println!("{:?}", iterator.next());
  70. println!("{:?}", iterator.next());
  71. println!("{:?}", iterator.next());
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement