1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
use crate::{
core::prelude::*,
errors::prelude::*,
};
/// `ArrayTrait` - Array Metadata functions
pub trait ArrayMeta<T: Clone> where Self: Sized + Clone {
/// Obtain the vector containing array elements
///
/// # Examples
///
/// ```
/// use arr_rs::prelude::*;
///
/// let arr = Array::new(vec![1,2,3,4], vec![4]).unwrap();
/// assert_eq!(vec![1, 2, 3, 4], arr.get_elements().unwrap());
/// ```
///
/// # Errors
///
/// may returns `ArrayError`
fn get_elements(&self) -> Result<Vec<T>, ArrayError>;
/// Obtain the vector containing array shape
///
/// # Examples
///
/// ```
/// use arr_rs::prelude::*;
///
/// let arr = Array::new(vec![1,2,3,4], vec![4]).unwrap();
/// assert_eq!(vec![4], arr.get_shape().unwrap());
/// ```
///
/// # Errors
///
/// may returns `ArrayError`
fn get_shape(&self) -> Result<Vec<usize>, ArrayError>;
/// Count of array dimensions
///
/// # Examples
///
/// ```
/// use arr_rs::prelude::*;
///
/// let arr_1 = Array::new(vec![1,2,3,4], vec![4]).unwrap();
/// let ndim_1 = arr_1.ndim().unwrap();
/// assert_eq!(1, ndim_1);
///
/// let arr_2 = Array::new(vec![1,2,3,4], vec![2, 2]).unwrap();
/// let ndim_2 = arr_2.ndim().unwrap();
/// assert_eq!(2, ndim_2);
/// ```
///
/// # Errors
///
/// may returns `ArrayError`
fn ndim(&self) -> Result<usize, ArrayError>;
/// Count of array elements
///
/// # Examples
///
/// ```
/// use arr_rs::prelude::*;
///
/// let arr = Array::new(vec![1,2,3,4], vec![4]).unwrap();
/// let len = arr.len().unwrap();
/// assert_eq!(4, len);
/// ```
///
/// # Errors
///
/// may returns `ArrayError`
fn len(&self) -> Result<usize, ArrayError>;
/// Check if array element count equals zero
///
/// # Examples
///
/// ```
/// use arr_rs::prelude::*;
///
/// let arr_1 = Array::new(vec![1,2,3,4], vec![4]).unwrap();
/// let empty_1 = arr_1.is_empty().unwrap();
/// assert_eq!(false, empty_1);
///
/// let arr_2: Array<f64> = Array::empty().unwrap();
/// let empty_2 = arr_2.is_empty().unwrap();
/// assert_eq!(true, empty_2);
/// ```
///
/// # Errors
///
/// may returns `ArrayError`
fn is_empty(&self) -> Result<bool, ArrayError>;
}
impl <T: ArrayElement> ArrayMeta<T> for Array<T> {
fn get_elements(&self) -> Result<Vec<T>, ArrayError> {
Ok(self.elements.clone())
}
fn get_shape(&self) -> Result<Vec<usize>, ArrayError> {
Ok(self.shape.clone())
}
fn ndim(&self) -> Result<usize, ArrayError> {
Ok(self.shape.len())
}
fn len(&self) -> Result<usize, ArrayError> {
Ok(self.elements.len())
}
fn is_empty(&self) -> Result<bool, ArrayError> {
Ok(self.len()? == 0)
}
}
impl <T: ArrayElement> ArrayMeta<T> for Result<Array<T>, ArrayError> {
fn get_elements(&self) -> Result<Vec<T>, ArrayError> {
self.clone()?.get_elements()
}
fn get_shape(&self) -> Result<Vec<usize>, ArrayError> {
self.clone()?.get_shape()
}
fn ndim(&self) -> Result<usize, ArrayError> {
self.clone()?.ndim()
}
fn len(&self) -> Result<usize, ArrayError> {
self.clone()?.len()
}
fn is_empty(&self) -> Result<bool, ArrayError> {
self.clone()?.is_empty()
}
}