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    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}