1use std::{convert::From, vec::IntoIter};
2
3pub struct Vector<T>(Vec<T>);
4
5impl<T> Vector<T> {
6 pub fn new() -> Self {
7 Self(vec![])
8 }
9
10 #[must_use]
11 pub fn push(mut self, value: T) -> Self {
12 self.0.push(value);
13
14 self
15 }
16
17 #[must_use]
18 pub fn update(mut self, i: usize, value: T) -> Self {
19 self.0[i] = value;
20
21 self
22 }
23
24 #[must_use]
25 pub fn remove(mut self, i: usize) -> Self {
26 self.0.remove(i);
27
28 self
29 }
30
31 #[must_use]
32 pub fn reverse(mut self) -> Self {
33 self.0.reverse();
34
35 self
36 }
37
38 #[must_use]
39 pub fn sort(mut self) -> Self
40 where
41 T: std::cmp::Ord,
42 {
43 self.0.sort();
44
45 self
46 }
47
48 #[must_use]
49 pub fn sort_by<F>(mut self, compare: F) -> Self
50 where
51 F: FnMut(&T, &T) -> std::cmp::Ordering,
52 {
53 self.0.sort_by(compare);
54
55 self
56 }
57
58 pub fn pop(mut self) -> (Self, Option<T>) {
59 let v = self.0.pop();
60
61 (self, v)
62 }
63
64 pub fn get(&self, i: usize) -> Option<&T> {
65 self.0.get(i)
66 }
67
68 pub fn is_empty(&self) -> bool {
69 self.0.is_empty()
70 }
71
72 pub fn len(&self) -> usize {
73 self.0.len()
74 }
75}
76
77impl<T> Default for Vector<T> {
78 fn default() -> Self {
79 Self::new()
80 }
81}
82
83impl<T> IntoIterator for Vector<T> {
84 type Item = T;
85 type IntoIter = IntoIter<Self::Item>;
86
87 fn into_iter(self) -> Self::IntoIter {
88 self.0.into_iter()
89 }
90}
91
92impl<T> FromIterator<T> for Vector<T> {
93 fn from_iter<I>(iter: I) -> Self
94 where
95 I: IntoIterator<Item = T>,
96 {
97 Self(iter.into_iter().collect())
98 }
99}
100
101impl<T> From<Vec<T>> for Vector<T> {
102 fn from(vector: Vec<T>) -> Self {
103 Self(vector)
104 }
105}
106
107impl<T> From<Vector<T>> for Vec<T> {
108 fn from(vector: Vector<T>) -> Self {
109 vector.0
110 }
111}
112
113#[cfg(test)]
114mod tests {
115 use super::Vector;
116
117 #[test]
118 fn new_and_default_are_empty() {
119 let vector = Vector::<i32>::new();
120 assert!(vector.is_empty());
121 assert_eq!(vector.len(), 0);
122
123 let default_vector = Vector::<i32>::default();
124 assert!(default_vector.is_empty());
125 assert_eq!(default_vector.len(), 0);
126 }
127
128 #[test]
129 fn push_update_remove_and_get() {
130 let vector = Vector::new().push(1).push(2).push(3);
131 assert_eq!(vector.len(), 3);
132 assert_eq!(vector.get(0), Some(&1));
133 assert_eq!(vector.get(2), Some(&3));
134
135 let vector = vector.update(1, 10);
136 assert_eq!(vector.get(1), Some(&10));
137
138 let vector = vector.remove(0);
139 assert_eq!(vector.len(), 2);
140 assert_eq!(vector.get(0), Some(&10));
141 assert_eq!(vector.get(1), Some(&3));
142 }
143
144 #[test]
145 fn reverse_sort_and_sort_by() {
146 let vector = Vector::new().push(3).push(1).push(2);
147 let vector = vector.reverse();
148 assert_eq!(vector.get(0), Some(&2));
149 assert_eq!(vector.get(1), Some(&1));
150 assert_eq!(vector.get(2), Some(&3));
151
152 let vector = vector.sort();
153 assert_eq!(vector.get(0), Some(&1));
154 assert_eq!(vector.get(1), Some(&2));
155 assert_eq!(vector.get(2), Some(&3));
156
157 let vector = vector.sort_by(|a, b| b.cmp(a));
158 assert_eq!(vector.get(0), Some(&3));
159 assert_eq!(vector.get(1), Some(&2));
160 assert_eq!(vector.get(2), Some(&1));
161 }
162
163 #[test]
164 fn pop_returns_removed_value() {
165 let vector = Vector::new().push(1).push(2);
166 let (vector, popped) = vector.pop();
167 assert_eq!(popped, Some(2));
168 assert_eq!(vector.len(), 1);
169
170 let (vector, popped) = vector.pop();
171 assert_eq!(popped, Some(1));
172 assert!(vector.is_empty());
173
174 let (_, popped) = Vector::<i32>::new().pop();
175 assert_eq!(popped, None);
176 }
177
178 #[test]
179 fn conversions_cover_all_variants() {
180 let base = vec![1, 2, 3];
181
182 let vector_from_vec = Vector::from(base.clone());
183 assert_eq!(vector_from_vec.len(), base.len());
184
185 let vec_from_vector: Vec<_> = Vector::from(base.clone()).into();
186 assert_eq!(vec_from_vector, base);
187
188 let vector_from_iter: Vector<_> = base.clone().into_iter().collect();
189 assert_eq!(vector_from_iter.len(), base.len());
190
191 let vec_from_iter_vector: Vec<_> = vector_from_iter.into();
192 assert_eq!(vec_from_iter_vector, base);
193
194 let iterated: Vec<_> = Vector::from(vec![1, 2, 3]).into_iter().collect();
195 assert_eq!(iterated, vec![1, 2, 3]);
196 }
197}