vec_cycle/
lib.rs

1use std::ops::{Deref, DerefMut};
2
3/// Cycles over a `Vec` as if it were an iterator, allowing mutation of the underlying data. That's it.
4#[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    /// Creates a `VecCycle` from a `Vec`
30    pub fn new(vector: Vec<T>) -> Self {
31        Self::from(vector)
32    }
33
34    /// Returns the index. Panics if the vector is empty.
35    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    /// Sets the index. Panics if the index is out of range.
41    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    /// Resets the index, making the cycle restart from index zero.
50    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}