From 513df1e2d3fee065c42b605046cef14ccbd26512 Mon Sep 17 00:00:00 2001 From: Jake Fecher Date: Mon, 21 Oct 2024 11:13:08 -0500 Subject: [PATCH 1/3] map empty arrays --- docs/docs/noir/concepts/data_types/arrays.md | 2 ++ noir_stdlib/src/array/mod.nr | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/docs/noir/concepts/data_types/arrays.md b/docs/docs/noir/concepts/data_types/arrays.md index bb68e60fe53..289145a8c4d 100644 --- a/docs/docs/noir/concepts/data_types/arrays.md +++ b/docs/docs/noir/concepts/data_types/arrays.md @@ -203,6 +203,8 @@ fn main() { Same as fold, but uses the first element as the starting element. +Requires `self` to be non-empty. + ```rust fn reduce(self, f: fn(T, T) -> T) -> T ``` diff --git a/noir_stdlib/src/array/mod.nr b/noir_stdlib/src/array/mod.nr index 46acf619dd2..934a0e33886 100644 --- a/noir_stdlib/src/array/mod.nr +++ b/noir_stdlib/src/array/mod.nr @@ -43,7 +43,7 @@ impl [T; N] { /// assert_eq(b, [2, 4, 6]); /// ``` pub fn map(self, f: fn[Env](T) -> U) -> [U; N] { - let first_elem = f(self[0]); + let first_elem = crate::mem::zeroed(); let mut ret = [first_elem; N]; for i in 1..self.len() { @@ -79,6 +79,8 @@ impl [T; N] { } /// Same as fold, but uses the first element as the starting element. + /// + /// Requires the input array to be non-empty. /// /// Example: /// @@ -217,3 +219,10 @@ impl From> for [u8; N] { s.as_bytes() } } + +mod test { + #[test] + fn map_empty() { + assert_eq([].map(|x| x + 1), []); + } +} From 45aac6c005aa93adfdba187a3540d0d1485c0230 Mon Sep 17 00:00:00 2001 From: Jake Fecher Date: Mon, 21 Oct 2024 11:15:04 -0500 Subject: [PATCH 2/3] Update bound --- noir_stdlib/src/array/mod.nr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noir_stdlib/src/array/mod.nr b/noir_stdlib/src/array/mod.nr index 934a0e33886..5e41124598e 100644 --- a/noir_stdlib/src/array/mod.nr +++ b/noir_stdlib/src/array/mod.nr @@ -46,7 +46,7 @@ impl [T; N] { let first_elem = crate::mem::zeroed(); let mut ret = [first_elem; N]; - for i in 1..self.len() { + for i in 0..self.len() { ret[i] = f(self[i]); } From 98acf90cff35579ce1f9853c65f6a18191babe48 Mon Sep 17 00:00:00 2001 From: Jake Fecher Date: Mon, 21 Oct 2024 13:04:48 -0500 Subject: [PATCH 3/3] Rename first_elem --- noir_stdlib/src/array/mod.nr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/noir_stdlib/src/array/mod.nr b/noir_stdlib/src/array/mod.nr index 5e41124598e..f5089de1877 100644 --- a/noir_stdlib/src/array/mod.nr +++ b/noir_stdlib/src/array/mod.nr @@ -43,8 +43,8 @@ impl [T; N] { /// assert_eq(b, [2, 4, 6]); /// ``` pub fn map(self, f: fn[Env](T) -> U) -> [U; N] { - let first_elem = crate::mem::zeroed(); - let mut ret = [first_elem; N]; + let uninitialized = crate::mem::zeroed(); + let mut ret = [uninitialized; N]; for i in 0..self.len() { ret[i] = f(self[i]);