Skip to content

Commit 5b725bb

Browse files
iAmMichaelConnorTomAFrenchasterite
authored
feat: array concat method (#7199)
Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> Co-authored-by: Ary Borenszweig <asterite@gmail.com>
1 parent 37be49f commit 5b725bb

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

cspell.json

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"combinators",
6161
"compinit",
6262
"comptime",
63+
"concat",
6364
"cpus",
6465
"cranelift",
6566
"critesjosh",

docs/docs/noir/concepts/data_types/arrays.md

+17
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,23 @@ fn main() {
255255
}
256256
```
257257

258+
### concat
259+
260+
Concatenates this array with another array.
261+
262+
```rust
263+
fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M]
264+
```
265+
266+
```rust
267+
fn main() {
268+
let arr1 = [1, 2, 3, 4];
269+
let arr2 = [6, 7, 8, 9, 10, 11];
270+
let concatenated_arr = arr1.concat(arr2);
271+
assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);
272+
}
273+
```
274+
258275
### as_str_unchecked
259276

260277
Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -

noir_stdlib/src/array/mod.nr

+55
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,29 @@ impl<T, let N: u32> [T; N] {
136136
}
137137
ret
138138
}
139+
140+
/// Concatenates this array with another array.
141+
///
142+
/// Example:
143+
///
144+
/// ```noir
145+
/// fn main() {
146+
/// let arr1 = [1, 2, 3, 4];
147+
/// let arr2 = [6, 7, 8, 9, 10, 11];
148+
/// let concatenated_arr = arr1.concat(arr2);
149+
/// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);
150+
/// }
151+
/// ```
152+
pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {
153+
let mut result = [crate::mem::zeroed(); N + M];
154+
for i in 0..N {
155+
result[i] = self[i];
156+
}
157+
for i in 0..M {
158+
result[i + N] = array2[i];
159+
}
160+
result
161+
}
139162
}
140163

141164
impl<T, let N: u32> [T; N]
@@ -232,4 +255,36 @@ mod test {
232255
fn map_empty() {
233256
assert_eq([].map(|x| x + 1), []);
234257
}
258+
259+
#[test]
260+
fn concat() {
261+
let arr1 = [1, 2, 3, 4];
262+
let arr2 = [6, 7, 8, 9, 10, 11];
263+
let concatenated_arr = arr1.concat(arr2);
264+
assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);
265+
}
266+
267+
#[test]
268+
fn concat_zero_length_with_something() {
269+
let arr1 = [];
270+
let arr2 = [1];
271+
let concatenated_arr = arr1.concat(arr2);
272+
assert_eq(concatenated_arr, [1]);
273+
}
274+
275+
#[test]
276+
fn concat_something_with_zero_length() {
277+
let arr1 = [1];
278+
let arr2 = [];
279+
let concatenated_arr = arr1.concat(arr2);
280+
assert_eq(concatenated_arr, [1]);
281+
}
282+
283+
#[test]
284+
fn concat_zero_lengths() {
285+
let arr1: [Field; 0] = [];
286+
let arr2: [Field; 0] = [];
287+
let concatenated_arr = arr1.concat(arr2);
288+
assert_eq(concatenated_arr, []);
289+
}
235290
}

0 commit comments

Comments
 (0)