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 diff --git a/slices/collect_slice.go b/slices/collect_slice.go index a1089cc..4e192fc 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, t := range input_slice { + + s, err := fn(&t) + if err != nil { + return []string{}, err + } + + result_slice[i] = s + } + + 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") + } +}