1use std::ops::{Deref, DerefMut};
2
3#[derive(Clone)]
5pub struct VecCycle<T: Clone> {
6 index: usize,
7 inner: Vec<T>,
8}
9
10impl<T: Clone> Iterator for VecCycle<T> {
11 type Item = T;
12
13 fn next(&mut self) -> Option<Self::Item> {
14 if self.inner.len() == 0 {
15 return None;
16 }
17
18 self.index %= self.inner.len();
19
20 let value = self.inner.get(self.index).map(|x| x.clone());
21
22 self.index = (self.index + 1) % self.inner.len();
23
24 value
25 }
26}
27
28impl<T: Clone> VecCycle<T> {
29 pub fn new(vector: Vec<T>) -> Self {
31 Self::from(vector)
32 }
33
34 pub fn index(&self) -> usize {
36 assert!(self.inner.len() != 0, "The contained vector is empty!");
37 self.index % self.inner.len()
38 }
39
40 pub fn set_index(&mut self, new_index: usize) {
42 assert!(
43 new_index < self.inner.len(),
44 "The given index is too large!"
45 );
46 self.index = new_index;
47 }
48
49 pub fn restart(&mut self) {
51 self.index = 0;
52 }
53}
54
55impl<T: Clone> Deref for VecCycle<T> {
56 type Target = Vec<T>;
57
58 fn deref(&self) -> &Self::Target {
59 &self.inner
60 }
61}
62
63impl<T: Clone> DerefMut for VecCycle<T> {
64 fn deref_mut(&mut self) -> &mut Self::Target {
65 &mut self.inner
66 }
67}
68
69impl<T: Clone> From<Vec<T>> for VecCycle<T> {
70 fn from(vector: Vec<T>) -> Self {
71 Self {
72 index: 0,
73 inner: vector,
74 }
75 }
76}