diff --git a/slice/slice.go b/slice/slice.go index df06646..855055f 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -162,6 +162,22 @@ func Equal[T comparable](slice1, slice2 []T) bool { return true } +// EqualWithFunc checks if two slices are equal with comparator func +func EqualWithFunc[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool { + if len(slice1) != len(slice2) { + return false + } + + for i, v1 := range slice1 { + v2 := slice2[i] + if !comparator(v1, v2) { + return false + } + } + + return true +} + // Every return true if all of the values in the slice pass the predicate function. func Every[T any](slice []T, predicate func(index int, item T) bool) bool { if predicate == nil { diff --git a/slice/slice_test.go b/slice/slice_test.go index e75283a..4a348d8 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -79,6 +79,19 @@ func TestEqual(t *testing.T) { assert.Equal(false, Equal(slice1, slice3)) } +func TestEqualWithFunc(t *testing.T) { + assert := internal.NewAssert(t, "TestEqualWithFunc") + + slice1 := []int{1, 2, 3} + slice2 := []int{2, 4, 6} + + isDouble := func(a, b int) bool { + return b == a*2 + } + + assert.Equal(true, EqualWithFunc(slice1, slice2, isDouble)) +} + func TestEvery(t *testing.T) { nums := []int{1, 2, 3, 5} isEven := func(i, num int) bool {