mirror of https://github.com/portainer/portainer
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
|
package unique
|
||
|
|
||
|
func Unique[T comparable](items []T) []T {
|
||
|
return UniqueBy(items, func(item T) T {
|
||
|
return item
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func UniqueBy[ItemType any, ComparableType comparable](items []ItemType, accessorFunc func(ItemType) ComparableType) []ItemType {
|
||
|
includedItems := make(map[ComparableType]bool)
|
||
|
result := []ItemType{}
|
||
|
|
||
|
for _, item := range items {
|
||
|
if _, isIncluded := includedItems[accessorFunc(item)]; !isIncluded {
|
||
|
includedItems[accessorFunc(item)] = true
|
||
|
result = append(result, item)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
|
||
|
type someType struct {
|
||
|
id int
|
||
|
fn func()
|
||
|
}
|
||
|
|
||
|
func Test() {
|
||
|
ids := []int{1, 2, 3, 3}
|
||
|
_ = UniqueBy(ids, func(id int) int { return id })
|
||
|
_ = Unique(ids) // shorthand for UniqueBy Identity/self
|
||
|
|
||
|
as := []someType{{id: 1}, {id: 2}, {id: 3}, {id: 3}}
|
||
|
_ = UniqueBy(as, func(item someType) int { return item.id }) // no error
|
||
|
_ = UniqueBy(as, func(item someType) someType { return item }) // compile error - someType is not comparable
|
||
|
_ = Unique(as) // compile error - shorthand fails for the same reason
|
||
|
}
|
||
|
|
||
|
*/
|