From 7fef1562f208898a966450fdc895136c60b10ebc Mon Sep 17 00:00:00 2001 From: Ruidy Date: Tue, 12 Apr 2022 17:32:13 -0400 Subject: [PATCH] unique function (#27) Co-authored-by: Ruidy --- docs/content/collections/unique.md | 21 +++++++++++++++++++++ unique.go | 12 ++++++++++++ unique_test.go | 16 ++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 docs/content/collections/unique.md create mode 100644 unique.go create mode 100644 unique_test.go diff --git a/docs/content/collections/unique.md b/docs/content/collections/unique.md new file mode 100644 index 0000000..4b1ba12 --- /dev/null +++ b/docs/content/collections/unique.md @@ -0,0 +1,21 @@ +--- +title: "Unique" +date: 2022-04-12T17:18:04-04:00 +--- + +`Unique` returns a duplicate-free version of the slice. Only the first occurrence of each value is kept. + +```go +package main + +import ( + "fmt" + u "github.com/rjNemo/underscore" +) + +func main() { + nums := []int{1, 4, 2, 5, 3, 1, 5, 2, 8, 9} + + fmt.Println(u.Unique(nums)) // 1, 4, 2, 5, 3, 8, 9 +} +``` diff --git a/unique.go b/unique.go new file mode 100644 index 0000000..718ddc8 --- /dev/null +++ b/unique.go @@ -0,0 +1,12 @@ +package underscore + +func Unique[T comparable](values []T) (uniques []T) { + seen := make(map[T]bool, 0) + for _, v := range values { + if _, ok := seen[v]; !ok { + uniques = append(uniques, v) + seen[v] = true + } + } + return uniques +} diff --git a/unique_test.go b/unique_test.go new file mode 100644 index 0000000..03ff72b --- /dev/null +++ b/unique_test.go @@ -0,0 +1,16 @@ +package underscore_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + u "github.com/rjNemo/underscore" +) + +func TestUnique(t *testing.T) { + nums := []int{1, 4, 2, 5, 3, 1, 5, 2, 8, 9} + want := []int{1, 4, 2, 5, 3, 8, 9} + + assert.Equal(t, want, u.Unique(nums)) +}