From 1b018a1fad4ba3c5399895fd087e9f99c79e220b Mon Sep 17 00:00:00 2001 From: Mitchell Adair Date: Wed, 9 Apr 2025 16:23:40 -0400 Subject: [PATCH 1/2] add `SliceEvery` --- slice.go | 9 ++++++++ slice_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/slice.go b/slice.go index 6bfc9d8..feef35e 100644 --- a/slice.go +++ b/slice.go @@ -31,6 +31,15 @@ func SliceContains[T any](slice []T, filter func(t T) bool) bool { return false } +func SliceEvery[T any](slice []T, filter func(t T) bool) bool { + for _, item := range slice { + if !filter(item) { + return false + } + } + return true +} + func SliceContainsElement[T comparable](slice []T, element T) bool { return SliceContains(slice, func(t T) bool { return t == element diff --git a/slice_test.go b/slice_test.go index 00b3c42..d4a762a 100644 --- a/slice_test.go +++ b/slice_test.go @@ -201,6 +201,69 @@ func TestSliceContains(t *testing.T) { }) } +func TestSliceEvery(t *testing.T) { + t.Parallel() + + t.Run("all elements match", func(t *testing.T) { + t.Parallel() + + slice := []int{1, 1, 1, 1} + returns := generic.SliceEvery(slice, func(i int) bool { + return i == 1 + }) + + t.Log("Should return true when all elements match condition") + assert.True(t, returns) + }) + + t.Run("returns false if not all elements match", func(t *testing.T) { + t.Parallel() + + slice := []int{1, 2, 1, 1} + returns := generic.SliceEvery(slice, func(i int) bool { + return i == 1 + }) + + t.Log("Should return false when not all elements match condition") + assert.False(t, returns) + }) + + t.Run("checks complex condition", func(t *testing.T) { + t.Parallel() + + type User struct { + Name string + Admin bool + } + + users := []User{ + {"Alice", false}, + {"Bob", false}, + {"Charlie", false}, + } + + returns := generic.SliceEvery(users, func(u User) bool { + return !u.Admin + }) + + t.Log("Should return true when all users are not admins") + assert.True(t, returns) + + users = []User{ + {"Alice", false}, + {"Bob", true}, + {"Charlie", false}, + } + + returns = generic.SliceEvery(users, func(u User) bool { + return u.Admin + }) + + t.Log("Should return false when not all users are admins") + assert.False(t, returns) + }) +} + func TestSliceContainsElement(t *testing.T) { t.Parallel() From 2e6509f3f19ac417ada663bd22426899e483d634 Mon Sep 17 00:00:00 2001 From: Mitchell Adair Date: Thu, 10 Apr 2025 13:16:53 -0400 Subject: [PATCH 2/2] rename to `AllElement` --- slice.go | 2 +- slice_test.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/slice.go b/slice.go index feef35e..2910ac1 100644 --- a/slice.go +++ b/slice.go @@ -31,7 +31,7 @@ func SliceContains[T any](slice []T, filter func(t T) bool) bool { return false } -func SliceEvery[T any](slice []T, filter func(t T) bool) bool { +func AllElements[T any](slice []T, filter func(t T) bool) bool { for _, item := range slice { if !filter(item) { return false diff --git a/slice_test.go b/slice_test.go index d4a762a..3a1840a 100644 --- a/slice_test.go +++ b/slice_test.go @@ -208,7 +208,7 @@ func TestSliceEvery(t *testing.T) { t.Parallel() slice := []int{1, 1, 1, 1} - returns := generic.SliceEvery(slice, func(i int) bool { + returns := generic.AllElements(slice, func(i int) bool { return i == 1 }) @@ -220,7 +220,7 @@ func TestSliceEvery(t *testing.T) { t.Parallel() slice := []int{1, 2, 1, 1} - returns := generic.SliceEvery(slice, func(i int) bool { + returns := generic.AllElements(slice, func(i int) bool { return i == 1 }) @@ -242,7 +242,7 @@ func TestSliceEvery(t *testing.T) { {"Charlie", false}, } - returns := generic.SliceEvery(users, func(u User) bool { + returns := generic.AllElements(users, func(u User) bool { return !u.Admin }) @@ -255,7 +255,7 @@ func TestSliceEvery(t *testing.T) { {"Charlie", false}, } - returns = generic.SliceEvery(users, func(u User) bool { + returns = generic.AllElements(users, func(u User) bool { return u.Admin })