From aefc52b14a744cf2d6d1ca97a4bd0f78840319ef Mon Sep 17 00:00:00 2001 From: Hazzoz Date: Wed, 26 Nov 2025 22:27:51 +1100 Subject: [PATCH 1/3] Completed CollectSliceIntoStringSlice implementation with unit tests --- slices/collect_slice.go | 17 +++++++ slices/collect_test.go | 98 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/slices/collect_slice.go b/slices/collect_slice.go index a1089cc..99d31bd 100644 --- a/slices/collect_slice.go +++ b/slices/collect_slice.go @@ -110,4 +110,21 @@ func CollectSliceOfString(input_slice []string, fn func(input_item string) strin return } +func CollectSliceIntoStringSlice[T any](input_slice []T, fn func(input_item *T) (string, error)) ([]string, error) { + + result_slice := make([]string, len(input_slice)) + + for i, s := range input_slice { + + a, err := fn(&s) + if err != nil { + return []string{}, err + } + + result_slice[i] = a + } + + return result_slice, nil +} + /* ///////////////////////////// end of file //////////////////////////// */ diff --git a/slices/collect_test.go b/slices/collect_test.go index 38e81d7..ceda8d3 100644 --- a/slices/collect_test.go +++ b/slices/collect_test.go @@ -1,8 +1,11 @@ package slices_test import ( + "fmt" + "github.com/synesissoftware/ANGoLS/slices" + "strconv" "strings" "testing" ) @@ -216,3 +219,98 @@ func Benchmark_equal_uints_by_EqualSlice(b *testing.B) { _ = slices.EqualSlice(ints_1, ints_2) } } + +func Test_CollectSliceIntoStringSlice(t *testing.T) { + + type Nickname string + + nicknames := []Nickname{ + "Goose", + "Ice Man", + "Maverick", + } + + result, err := slices.CollectSliceIntoStringSlice[Nickname](nicknames, func(input_item *Nickname) (string, error) { + return string(*input_item), nil + }) + + if err != nil { + t.Errorf("CollectSliceIntoStringSlice() returned error: %v", err) + } + + expected := []string{"Goose", "Ice Man", "Maverick"} + + if !slices.EqualSliceOfString(result, expected) { + t.Errorf("actual value '%v' does not equal expected value '%v'", result, expected) + } +} + +func Test_CollectSliceIntoStringSlice_with_CaseTesting(t *testing.T) { + + type Nickname string + + nicknames := []Nickname{ + "Goose", + "Ice Man", + "Maverick", + } + + result, err := slices.CollectSliceIntoStringSlice[Nickname](nicknames, func(input_item *Nickname) (string, error) { + return strings.ToUpper(string(*input_item)), nil + }) + + if err != nil { + t.Errorf("CollectSliceIntoStringSlice() returned error: %v", err) + } + + expected := []string{"GOOSE", "ICE MAN", "MAVERICK"} + + if !slices.EqualSliceOfString(result, expected) { + t.Errorf("actual value '%v' does not equal expected value '%v'", result, expected) + } +} + +func Test_CollectSliceIntoStringSlice_with_Ints(t *testing.T) { + + values := []int{ + 1, + 2, + 3, + } + + result, err := slices.CollectSliceIntoStringSlice[int](values, func(input_item *int) (string, error) { + return strconv.Itoa(*input_item), nil + }) + + if err != nil { + t.Errorf("CollectSliceIntoStringSlice() returned error: %v", err) + } + + expected := []string{"1", "2", "3"} + + if !slices.EqualSliceOfString(result, expected) { + t.Errorf("actual value '%v' does not equal expected value '%v'", result, expected) + } +} + +func Test_CollectSliceIntoStringSlice_with_Fail(t *testing.T) { + + type Nickname string + + nicknames := []Nickname{ + "Goose", + "Ice Man", + "Maverick", + } + + _, err := slices.CollectSliceIntoStringSlice[Nickname](nicknames, func(input_item *Nickname) (string, error) { + if strings.Contains(string(*input_item), "k") { + return "", fmt.Errorf("invalid nickname: %s", *input_item) + } + return string(*input_item), nil + }) + + if err == nil { + t.Errorf("CollectSliceIntoStringSlice() should've failed") + } +} From bda0d7c5c8bb68c16b3de2ea0311162a37be919e Mon Sep 17 00:00:00 2001 From: Hazzoz Date: Thu, 27 Nov 2025 07:12:52 +1100 Subject: [PATCH 2/3] Updated names --- slices/collect_slice.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slices/collect_slice.go b/slices/collect_slice.go index 99d31bd..4e192fc 100644 --- a/slices/collect_slice.go +++ b/slices/collect_slice.go @@ -114,14 +114,14 @@ func CollectSliceIntoStringSlice[T any](input_slice []T, fn func(input_item *T) result_slice := make([]string, len(input_slice)) - for i, s := range input_slice { + for i, t := range input_slice { - a, err := fn(&s) + s, err := fn(&t) if err != nil { return []string{}, err } - result_slice[i] = a + result_slice[i] = s } return result_slice, nil From bb47afaba9777d8b76efa53a980801a377f36e9f Mon Sep 17 00:00:00 2001 From: Hazzoz Date: Thu, 27 Nov 2025 07:41:12 +1100 Subject: [PATCH 3/3] Updated README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 55b8d39..3f3893c 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,8 @@ func CollectSliceOfInteger[N int8 | int16 | int32 | int64 | int | uint8 | uint16 func CollectSliceOfFloat64(input_slice []float64, fn func(input_item float64) float64) (result_slice []float64) func CollectSliceOfString(input_slice []string, fn func(input_item string) string) (result_slice []string) + +func CollectSliceIntoStringSlice[T any](input_slice []T, fn func(input_item *T) (string, error)) ([]string, error) ``` ```Go