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}