Commit 2ab03d3
Changed files (4)
pkg
context
pkg/context/key.go
@@ -3,7 +3,7 @@ package context
import (
"context"
- "github.com/xlgmokha/x/pkg/reflect"
+ "github.com/xlgmokha/x/pkg/x"
)
type Key[T any] string
@@ -16,5 +16,5 @@ func (self Key[T]) From(ctx context.Context) T {
if value := ctx.Value(self); value != nil {
return value.(T)
}
- return reflect.Default[T]()
+ return x.Default[T]()
}
pkg/x/iterate.go
@@ -0,0 +1,22 @@
+package x
+
+type Predicate[T any] func(T) bool
+
+func Find[T any](items []T, predicate Predicate[T]) T {
+ for _, item := range items {
+ if predicate(item) {
+ return item
+ }
+ }
+ return Default[T]()
+}
+
+func FindAll[T any](items []T, predicate Predicate[T]) []T {
+ results := []T{}
+ for _, item := range items {
+ if predicate(item) {
+ results = append(results, item)
+ }
+ }
+ return results
+}
pkg/x/iterate_test.go
@@ -0,0 +1,51 @@
+package x
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestFind(t *testing.T) {
+ t.Run("returns the item", func(t *testing.T) {
+ items := []int{1, 2, 3, 42, 5}
+
+ result := Find(items, func(item int) bool {
+ return item == 42
+ })
+
+ assert.Equal(t, 42, result)
+ })
+
+ t.Run("returns the zero value", func(t *testing.T) {
+ items := []int{1, 2, 3, 4, 5}
+
+ result := Find(items, func(item int) bool {
+ return item == 42
+ })
+
+ assert.Equal(t, 0, result)
+ })
+}
+
+func TestFindAll(t *testing.T) {
+ t.Run("returns all matching items", func(t *testing.T) {
+ items := []int{1, 2, 3, 4, 5}
+
+ results := FindAll(items, func(item int) bool {
+ return item%2 == 0
+ })
+
+ assert.Equal(t, []int{2, 4}, results)
+ })
+
+ t.Run("returns an empty slice", func(t *testing.T) {
+ items := []int{1, 3, 5, 7}
+
+ results := FindAll(items, func(item int) bool {
+ return item%2 == 0
+ })
+
+ assert.Empty(t, results)
+ })
+}
pkg/reflect/zero.go → pkg/x/types.go
@@ -1,4 +1,4 @@
-package reflect
+package x
func Default[T any]() T {
var item T