arr_rs/core/operations/
create.rs

1use crate::{
2    core::prelude::*,
3    errors::prelude::*,
4    validators::prelude::*,
5};
6
7/// `ArrayTrait` - Array Create functions
8pub trait ArrayCreate<T: ArrayElement> where Self: Sized + Clone {
9
10    /// Creates new array
11    ///
12    /// # Arguments
13    ///
14    /// * `elements` - vector representing array elements
15    /// * `shape` - vector representing array elements
16    ///
17    /// # Examples
18    ///
19    /// ```
20    /// use arr_rs::prelude::*;
21    ///
22    /// let arr = Array::new(vec![1, 2, 3, 4], vec![4]).unwrap();
23    /// assert_eq!("[1, 2, 3, 4]", format!("{arr}"));
24    ///
25    /// let arr = Array::new(vec![1, 2, 3, 4], vec![2, 2]).unwrap();
26    /// assert_eq!("[[1, 2], [3, 4]]", format!("{arr}"));
27    /// assert_eq!("[[1, 2],\n [3, 4]]", format!("{arr:#}"));
28    /// ```
29    ///
30    /// # Errors
31    ///
32    /// may returns `ArrayError`
33    fn new(elements: Vec<T>, shape: Vec<usize>) -> Result<Self, ArrayError>;
34
35    /// Creates new array
36    ///
37    /// # Arguments
38    ///
39    /// * `elements` - vector representing array elements
40    /// * `shape` - vector representing array elements
41    ///
42    /// # Examples
43    ///
44    /// ```
45    /// use arr_rs::prelude::*;
46    ///
47    /// let arr = Array::create(vec![1, 2, 3, 4], vec![4], None).unwrap();
48    /// assert_eq!("[1, 2, 3, 4]", format!("{arr}"));
49    ///
50    /// let arr = Array::create(vec![1, 2, 3, 4], vec![2, 2], Some(1)).unwrap();
51    /// assert_eq!("[[1, 2], [3, 4]]", format!("{arr}"));
52    /// assert_eq!("[[1, 2],\n [3, 4]]", format!("{arr:#}"));
53    ///
54    /// let arr = Array::create(vec![1, 2, 3, 4], vec![2, 2], Some(3)).unwrap();
55    /// assert_eq!("[[[1, 2], [3, 4]]]", format!("{arr}"));
56    /// assert_eq!("[[[1, 2],\n  [3, 4]]]", format!("{arr:#}"));
57    /// ```
58    ///
59    /// # Errors
60    ///
61    /// may returns `ArrayError`
62    fn create(elements: Vec<T>, shape: Vec<usize>, ndmin: Option<usize>) -> Result<Self, ArrayError>;
63
64    /// Creates new array with single element
65    ///
66    /// # Arguments
67    ///
68    /// * `element` - array element
69    ///
70    /// # Examples
71    ///
72    /// ```
73    /// use arr_rs::prelude::*;
74    ///
75    /// let arr = Array::<i32>::single(1);
76    /// assert_eq!(vec![1], arr.get_elements().unwrap());
77    /// assert_eq!(vec![1], arr.get_shape().unwrap());
78    /// ```
79    ///
80    /// # Errors
81    ///
82    /// may returns `ArrayError`
83    fn single(element: T) -> Result<Self, ArrayError>;
84
85    /// Creates new flat array
86    ///
87    /// # Arguments
88    ///
89    /// * `elements` - vector representing array elements
90    ///
91    /// # Examples
92    ///
93    /// ```
94    /// use arr_rs::prelude::*;
95    ///
96    /// assert_eq!(array!(i32, [1, 2, 3, 4]), Array::<i32>::flat(vec![1, 2, 3, 4]));
97    /// ```
98    ///
99    /// # Errors
100    ///
101    /// may returns `ArrayError`
102    fn flat(elements: Vec<T>) -> Result<Self, ArrayError>;
103
104    /// Creates new empty array
105    ///
106    /// # Examples
107    ///
108    /// ```
109    /// use arr_rs::prelude::*;
110    ///
111    /// assert!(Array::<i32>::empty().is_empty().unwrap());
112    /// ```
113    ///
114    /// # Errors
115    ///
116    /// may returns `ArrayError`
117    fn empty() -> Result<Self, ArrayError>;
118}
119
120impl <T: ArrayElement> ArrayCreate<T> for Array<T> {
121
122    fn new(elements: Vec<T>, shape: Vec<usize>) -> Result<Self, ArrayError> {
123        shape.matches_values_len(&elements)?;
124        Ok(Self { elements, shape, })
125    }
126
127    fn create(elements: Vec<T>, shape: Vec<usize>, ndmin: Option<usize>) -> Result<Self, ArrayError> {
128        let ndmin = ndmin.unwrap_or(0);
129        let array = Self::new(elements, shape.clone());
130        if ndmin > shape.len() {
131            let mut new_shape = vec![1; ndmin - shape.len()];
132            new_shape.extend_from_slice(&shape);
133            array.reshape(&new_shape)
134        } else {
135            array
136        }
137    }
138
139    fn single(element: T) -> Result<Self, ArrayError> {
140        Self::new(vec![element], vec![1])
141    }
142
143    fn flat(elements: Vec<T>) -> Result<Self, ArrayError> {
144        Self::new(elements.clone(), vec![elements.len()])
145    }
146
147    fn empty() -> Result<Self, ArrayError> {
148        Self::new(vec![], vec![0])
149    }
150}