linalgz/
vector.rs

1//! Vector type definition.
2
3mod fns;
4mod ops;
5
6use std::fmt;
7use std::slice::Iter;
8use std::vec::Vec;
9
10pub use crate::vector::fns::*;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct Vector<T>(Vec<T>);
14
15impl<T> Vector<T> {
16    /// Initializes a new [Vector] from a [Vec].
17    ///
18    /// # Example
19    /// ```
20    /// use linalgz::*;
21    ///
22    /// let v = Vector::new(vec![1, 2, 3]);
23    /// assert_eq!(v, vector![1, 2, 3])
24    /// ```
25    pub fn new(vec: Vec<T>) -> Vector<T> {
26        Vector(vec)
27    }
28
29    /// Returns the [Vector] length.
30    ///
31    /// # Example
32    /// ```
33    /// use linalgz::*;
34    ///
35    /// let v = vector![1, 2, 3];
36    /// assert_eq!(v.len(), 3);
37    /// ```
38    pub fn len(&self) -> usize {
39        self.0.len()
40    }
41
42    /// Returns true if the [Vector] is empty.
43    ///
44    /// # Example
45    /// ```
46    /// use linalgz::*;
47    ///
48    /// let v: Vector<i32> = vector![];
49    /// assert!(v.is_empty());
50    /// ```
51    pub fn is_empty(&self) -> bool {
52        self.0.is_empty()
53    }
54
55    /// Returns an [Vector] iterator.
56    ///
57    /// # Example
58    /// ```
59    /// use linalgz::*;
60    ///
61    /// let v = vector![1, 2, 3];
62    /// for e in v.iter() {
63    ///     println!("{}", e)
64    /// }
65    /// ```
66    pub fn iter(&self) -> Iter<'_, T> {
67        self.0.iter()
68    }
69
70    /// Appends a new element to the [Vector].
71    ///
72    /// # Example
73    /// ```
74    /// use linalgz::*;
75    ///
76    /// let mut v = vector![1, 2, 3];
77    /// v.push(4);
78    /// assert_eq!(v, vector![1, 2, 3, 4]);
79    /// ```
80    pub fn push(&mut self, val: T) {
81        self.0.push(val)
82    }
83}
84
85impl<T> fmt::Display for Vector<T>
86where
87    T: fmt::Display,
88{
89    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
90        let v = &self.0;
91
92        write!(f, "[")?;
93        for (cnt, e) in v.iter().enumerate() {
94            if cnt != 0 {
95                write!(f, ", ")?;
96            }
97            write!(f, "{}", e)?;
98        }
99        write!(f, "]")
100    }
101}
102
103#[cfg(test)]
104mod test {
105    use crate::vector::*;
106    use crate::*;
107
108    #[test]
109    fn test_fmt() {
110        let v: Vector<f32> = vector![1.4, 1.23, 3.34];
111        let w = vector![2.8, -1.1, 1.6];
112
113        assert!(!v.is_empty());
114
115        let k = outer(&v, &w);
116
117        let expect = String::from(
118            "[[3.9199998, -1.54, 2.24], [3.444, -1.353, 1.968], [9.351999, -3.674, 5.344]]",
119        );
120        assert_eq!(expect, format!("{}", k))
121    }
122}