From 2015d36b0848e5e24a15acfd6af6aac5a4e39730 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 24 Oct 2024 14:56:13 +0800 Subject: [PATCH] feat: add JoinFunc --- docs/api/packages/slice.md | 32 ++++++++++++++++++++++++++++ docs/en/api/packages/slice.md | 30 ++++++++++++++++++++++++++ slice/slice.go | 13 ++++++++++++ slice/slice_example_test.go | 11 ++++++++++ slice/slice_test.go | 40 +++++++++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+) diff --git a/docs/api/packages/slice.md b/docs/api/packages/slice.md index 2714f5c..d30741a 100644 --- a/docs/api/packages/slice.md +++ b/docs/api/packages/slice.md @@ -106,6 +106,8 @@ import ( - [RightPadding](#RightPadding) - [LeftPadding](#LeftPadding) - [Frequency](#Frequency) +- [JoinFunc](#JoinFunc) +
@@ -2984,4 +2986,34 @@ func main() { // Output: // map[a:1 b:2 c:3] } +``` + +### JoinFunc + +

将切片元素用给定的分隔符连接成一个单一的字符串。

+ +函数签名: + +```go +func JoinFunc[T any](slice []T, sep string, transform func(T) T) string +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + result := slice.JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string { + return strings.ToUpper(s) + }) + + fmt.Println(result) + + // Output: + // A, B, C +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/slice.md b/docs/en/api/packages/slice.md index 5d580e4..bf7c419 100644 --- a/docs/en/api/packages/slice.md +++ b/docs/en/api/packages/slice.md @@ -2979,4 +2979,34 @@ func main() { // Output: // map[a:1 b:2 c:3] } +``` + +### JoinFunc + +

Joins the slice elements into a single string with the given separator.

+ +Signature: + +```go +func JoinFunc[T any](slice []T, sep string, transform func(T) T) string +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + result := slice.JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string { + return strings.ToUpper(s) + }) + + fmt.Println(result) + + // Output: + // A, B, C +} ``` \ No newline at end of file diff --git a/slice/slice.go b/slice/slice.go index a5e00d6..d4de36e 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -1398,3 +1398,16 @@ func Frequency[T comparable](slice []T) map[T]int { return result } + +// JoinFunc joins the slice elements into a single string with the given separator. +// Play: todo +func JoinFunc[T any](slice []T, sep string, transform func(T) T) string { + var buf strings.Builder + for i, v := range slice { + if i > 0 { + buf.WriteString(sep) + } + buf.WriteString(fmt.Sprint(transform(v))) + } + return buf.String() +} diff --git a/slice/slice_example_test.go b/slice/slice_example_test.go index 132c4d6..460283b 100644 --- a/slice/slice_example_test.go +++ b/slice/slice_example_test.go @@ -1261,3 +1261,14 @@ func ExampleFrequency() { // Output: // map[a:1 b:2 c:3] } + +func ExampleJoinFunc() { + result := JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string { + return strings.ToUpper(s) + }) + + fmt.Println(result) + + // Output: + // A, B, C +} diff --git a/slice/slice_test.go b/slice/slice_test.go index 74e55b4..f05d472 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -1816,3 +1816,43 @@ func TestFrequency(t *testing.T) { assert.Equal(expected, result) }) } + +func TestJoinFunc(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestJoinFunc") + + t.Run("basic case", func(t *testing.T) { + result := JoinFunc([]int{1, 2, 3}, ", ", func(i int) int { + return i * 2 + }) + + expected := "2, 4, 6" + assert.Equal(expected, result) + }) + + t.Run("empty slice", func(t *testing.T) { + result := JoinFunc([]int{}, ", ", func(i int) int { + return i * 2 + }) + + assert.Equal("", result) + }) + + t.Run("single element slice", func(t *testing.T) { + result := JoinFunc([]int{1}, ", ", func(i int) int { + return i * 2 + }) + + assert.Equal("2", result) + }) + + t.Run("string slice", func(t *testing.T) { + result := JoinFunc([]string{"a", "b", "c"}, ", ", func(s string) string { + return strings.ToUpper(s) + }) + + expected := "A, B, C" + assert.Equal(expected, result) + }) +}