diff --git a/mr.go b/mr.go index 6e40aa2..d98e957 100644 --- a/mr.go +++ b/mr.go @@ -1,5 +1,7 @@ package mr +import "strings" + func Map[T any, R any](ts []T, f func(T) R) []R { nt := make([]R, 0, len(ts)) for _, t := range ts { @@ -107,3 +109,14 @@ func Paginate[T any](list []T, page, size int) []T { } return list[offset : offset+size] } + +func Join[T any](list []T, sep string, f func(T) string) string { + var builder strings.Builder + for i := 0; i < len(list); i++ { + if i > 0 { + builder.WriteString(sep) + } + builder.WriteString(f(list[i])) + } + return builder.String() +} diff --git a/mr_test.go b/mr_test.go index 3ee234a..8504c1d 100644 --- a/mr_test.go +++ b/mr_test.go @@ -1,6 +1,7 @@ package mr import ( + "strconv" "testing" "github.com/stretchr/testify/assert" @@ -263,3 +264,12 @@ func TestPaginate(t *testing.T) { result = Paginate(ts, 2, 2) assert.Equal(t, expected, result) } + +func TestJoin(t *testing.T) { + str := Join(test_int_arr, ",", func(i int) string { return strconv.Itoa(i) }) + assert.Equal(t, "1,2,3,4,5", str) + + ts := []int{} + str = Join(ts, ",", func(i int) string { return strconv.Itoa(i) }) + assert.Empty(t, str) +}