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 pub fn push(mut self, value: T) -> Self {
11 self.0.push(value);
12
13 self
14 }
15
16 pub fn update(mut self, i: usize, value: T) -> Self {
17 self.0[i] = value;
18
19 self
20 }
21
22 pub fn remove(mut self, i: usize) -> Self {
23 self.0.remove(i);
24
25 self
26 }
27
28 pub fn reverse(mut self) -> Self {
29 self.0.reverse();
30
31 self
32 }
33
34 pub fn sort(mut self) -> Self
35 where
36 T: std::cmp::Ord,
37 {
38 self.0.sort();
39
40 self
41 }
42
43 pub fn sort_by<F>(mut self, compare: F) -> Self
44 where
45 F: FnMut(&T, &T) -> std::cmp::Ordering,
46 {
47 self.0.sort_by(compare);
48
49 self
50 }
51
52 pub fn pop(mut self) -> (Self, Option<T>) {
53 let v = self.0.pop();
54
55 (self, v)
56 }
57
58 pub fn get(&self, i: usize) -> Option<&T> {
59 self.0.get(i)
60 }
61
62 pub fn is_empty(&self) -> bool {
63 self.0.is_empty()
64 }
65
66 pub fn len(&self) -> usize {
67 self.0.len()
68 }
69}
70
71impl<T> Default for Vector<T> {
72 fn default() -> Self {
73 Self::new()
74 }
75}
76
77impl<T> IntoIterator for Vector<T> {
78 type Item = T;
79 type IntoIter = IntoIter<Self::Item>;
80
81 fn into_iter(self) -> Self::IntoIter {
82 self.0.into_iter()
83 }
84}
85
86impl<T> FromIterator<T> for Vector<T> {
87 fn from_iter<I>(iter: I) -> Self
88 where
89 I: IntoIterator<Item = T>,
90 {
91 Self(iter.into_iter().collect())
92 }
93}
94
95impl<T> From<Vec<T>> for Vector<T> {
96 fn from(vector: Vec<T>) -> Self {
97 Self(vector)
98 }
99}
100
101impl<T> From<Vector<T>> for Vec<T> {
102 fn from(vector: Vector<T>) -> Self {
103 vector.0
104 }
105}
106
107#[cfg(test)]
108mod tests {
109 use super::Vector;
110
111 #[test]
112 fn test_len() {
113 let mut vector = Vector::new();
114 assert_eq!(vector.len(), 0);
115
116 vector = vector.push(1);
117 assert_eq!(vector.len(), 1);
118
119 vector = vector.push(2);
120 assert_eq!(vector.len(), 2);
121 }
122
123 #[test]
124 fn test_is_empty() {
125 let mut vector = Vector::new();
126 assert!(vector.is_empty());
127
128 vector = vector.push(1);
129 assert!(!vector.is_empty());
130 }
131}