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}