gonk_database/
index.rs

1#[derive(Debug)]
2pub struct Index<T> {
3    pub data: Vec<T>,
4    index: Option<usize>,
5}
6
7impl<T> Index<T> {
8    pub fn new(data: Vec<T>, index: Option<usize>) -> Self {
9        Self { data, index }
10    }
11    pub fn up(&mut self) {
12        if self.data.is_empty() {
13            return;
14        }
15
16        if let Some(index) = &mut self.index {
17            if *index > 0 {
18                *index -= 1;
19            } else {
20                *index = self.data.len() - 1;
21            }
22        }
23    }
24    pub fn down(&mut self) {
25        if self.data.is_empty() {
26            return;
27        }
28
29        if let Some(index) = &mut self.index {
30            if *index + 1 < self.data.len() {
31                *index += 1;
32            } else {
33                *index = 0;
34            }
35        }
36    }
37    pub fn up_with_len(&mut self, len: usize) {
38        if let Some(index) = &mut self.index {
39            if *index > 0 {
40                *index -= 1;
41            } else {
42                *index = len - 1;
43            }
44        }
45    }
46    pub fn down_with_len(&mut self, len: usize) {
47        if let Some(index) = &mut self.index {
48            if *index + 1 < len {
49                *index += 1;
50            } else {
51                *index = 0;
52            }
53        }
54    }
55    pub fn selected(&self) -> Option<&T> {
56        if let Some(index) = self.index {
57            if let Some(item) = self.data.get(index) {
58                return Some(item);
59            }
60        }
61        None
62    }
63    pub fn selected_mut(&mut self) -> Option<&mut T> {
64        if let Some(index) = self.index {
65            if let Some(item) = self.data.get_mut(index) {
66                return Some(item);
67            }
68        }
69        None
70    }
71    pub fn index(&self) -> Option<usize> {
72        self.index
73    }
74    pub fn len(&self) -> usize {
75        self.data.len()
76    }
77    pub fn select(&mut self, i: Option<usize>) {
78        self.index = i;
79    }
80    pub fn is_empty(&self) -> bool {
81        self.data.is_empty()
82    }
83    pub fn as_slice(&self) -> &[T] {
84        &self.data
85    }
86    pub fn remove(&mut self, index: usize) {
87        self.data.remove(index);
88        let len = self.len();
89        if let Some(selected) = self.index {
90            if index == len && selected == len {
91                self.index = Some(len.saturating_sub(1));
92            } else if index == 0 && selected == 0 {
93                self.index = Some(0);
94            } else if len == 0 {
95                self.index = None;
96            }
97        }
98    }
99}
100
101impl<T> From<Vec<T>> for Index<T> {
102    fn from(vec: Vec<T>) -> Self {
103        let index = if vec.is_empty() { None } else { Some(0) };
104        Self::new(vec, index)
105    }
106}
107
108impl<T> Default for Index<T> {
109    fn default() -> Self {
110        Self {
111            data: Vec::new(),
112            index: None,
113        }
114    }
115}