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}