gluesql_utils/
vector.rs

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}