From d186c3946f64a1ce7a120918602a147f8e66128c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 24 Jul 2024 10:37:20 -0300 Subject: [PATCH] arrays: fix arrays.fold, when the `init` value in the call, is an array (#21921) --- vlib/arrays/arrays.v | 7 ++++++- vlib/arrays/arrays_fold_test.v | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 vlib/arrays/arrays_fold_test.v diff --git a/vlib/arrays/arrays.v b/vlib/arrays/arrays.v index 04d7daa9e4..6fa6fdb83b 100644 --- a/vlib/arrays/arrays.v +++ b/vlib/arrays/arrays.v @@ -331,7 +331,12 @@ pub fn filter_indexed[T](array []T, predicate fn (idx int, elem T) bool) []T { // assert r == 5 // ``` pub fn fold[T, R](array []T, init R, fold_op fn (acc R, elem T) R) R { - mut value := init + mut value := R{} + $if R is $array { + value = init.clone() + } $else { + value = init + } for e in array { value = fold_op(value, e) diff --git a/vlib/arrays/arrays_fold_test.v b/vlib/arrays/arrays_fold_test.v new file mode 100644 index 0000000000..c854587d47 --- /dev/null +++ b/vlib/arrays/arrays_fold_test.v @@ -0,0 +1,21 @@ +import arrays + +type MyInt = int + +fn test_main() { + assert arrays.fold[int, []int]([1, 2, 3, 4], []int{}, fn (r []int, t int) []int { + return arrays.merge(r, [t]) + }) == [1, 2, 3, 4] + assert arrays.fold[string, []string](['a', 'b', 'c', 'd'], []string{}, fn (r []string, t string) []string { + return arrays.merge(r, [t]) + }) == ['a', 'b', 'c', 'd'] + assert arrays.fold[bool, []bool]([true, false], []bool{}, fn (r []bool, t bool) []bool { + return arrays.merge(r, [t]) + }) == [false, true] + assert arrays.fold[MyInt, []MyInt]([MyInt(0), 1], []MyInt{}, fn (r []MyInt, t MyInt) []MyInt { + return arrays.merge(r, [t]) + }) == [MyInt(0), 1] + assert arrays.fold([1, 2, 3, 4], [5, 6, 7], fn (r []int, t int) []int { + return r.map(it * t) + }) == [120, 144, 168] +}