diff --git a/core/stringx/strings.go b/core/stringx/strings.go index 4d09e1b73..b6b8f5a82 100644 --- a/core/stringx/strings.go +++ b/core/stringx/strings.go @@ -15,6 +15,12 @@ var ( ErrInvalidStopPosition = errors.New("stop position is invalid") ) +// Contains checks if str is in list. +// Deprecated: use slices.Contains instead. +func Contains(list []string, str string) bool { + return slices.Contains(list, str) +} + // Filter filters chars from s with given filter function. func Filter(s string, filter func(r rune) bool) string { var n int diff --git a/core/stringx/strings_test.go b/core/stringx/strings_test.go index 15fadce73..3fb3e7bce 100644 --- a/core/stringx/strings_test.go +++ b/core/stringx/strings_test.go @@ -7,6 +7,28 @@ import ( "github.com/stretchr/testify/assert" ) +func TestContainsString(t *testing.T) { + cases := []struct { + slice []string + value string + expect bool + }{ + {[]string{"1"}, "1", true}, + {[]string{"1"}, "2", false}, + {[]string{"1", "2"}, "1", true}, + {[]string{"1", "2"}, "3", false}, + {nil, "3", false}, + {nil, "", false}, + } + + for _, each := range cases { + t.Run(path.Join(each.slice...), func(t *testing.T) { + actual := Contains(each.slice, each.value) + assert.Equal(t, each.expect, actual) + }) + } +} + func TestNotEmpty(t *testing.T) { cases := []struct { args []string diff --git a/core/syncx/once.go b/core/syncx/once.go new file mode 100644 index 000000000..f6a638918 --- /dev/null +++ b/core/syncx/once.go @@ -0,0 +1,9 @@ +package syncx + +import "sync" + +// Once returns a func that guarantees fn can only called once. +// Deprecated: use sync.OnceFunc instead. +func Once(fn func()) func() { + return sync.OnceFunc(fn) +} diff --git a/core/syncx/once_test.go b/core/syncx/once_test.go new file mode 100644 index 000000000..9e7fd71d3 --- /dev/null +++ b/core/syncx/once_test.go @@ -0,0 +1,33 @@ +package syncx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestOnce(t *testing.T) { + var v int + add := Once(func() { + v++ + }) + + for i := 0; i < 5; i++ { + add() + } + + assert.Equal(t, 1, v) +} + +func BenchmarkOnce(b *testing.B) { + var v int + add := Once(func() { + v++ + }) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + add() + } + assert.Equal(b, 1, v) +}