Commit 2ab03d3

mo khan <mo@mokhan.ca>
2022-09-24 02:57:10
feat: add helper for searching through a slice
1 parent bb7ed5d
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