diff --git a/fn/slice.go b/fn/slice.go index 2e27acc45..f42d34544 100644 --- a/fn/slice.go +++ b/fn/slice.go @@ -198,3 +198,10 @@ func Sum[B Number](items []B) B { return a + b }, 0, items) } + +// HasDuplicates checks if the given slice contains any duplicate elements. +// It returns false if there are no duplicates in the slice (i.e., all elements +// are unique), otherwise returns false. +func HasDuplicates[A comparable](items []A) bool { + return len(NewSet(items...)) != len(items) +} diff --git a/fn/slice_test.go b/fn/slice_test.go index de02be836..016ef87d3 100644 --- a/fn/slice_test.go +++ b/fn/slice_test.go @@ -241,3 +241,43 @@ func TestSliceToMap(t *testing.T) { }) } } + +// TestHasDuplicates tests the HasDuplicates function. +func TestHasDuplicates(t *testing.T) { + // Define test cases. + testCases := []struct { + name string + items []int + want bool + }{ + { + name: "All unique", + items: []int{1, 2, 3, 4, 5}, + want: false, + }, + { + name: "Some duplicates", + items: []int{1, 2, 2, 3, 4}, + want: true, + }, + { + name: "No items", + items: []int{}, + want: false, + }, + { + name: "All duplicates", + items: []int{1, 1, 1, 1}, + want: true, + }, + } + + // Execute each test case. + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + got := HasDuplicates(tc.items) + + require.Equal(t, tc.want, got) + }) + } +}