| 12345678910111213141516171819202122 |
- // Copyright 2024 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package container
-
- import "slices"
-
- // FilterSlice ranges over the slice and calls include() for each element.
- // If the second returned value is true, the first returned value will be included in the resulting
- // slice (after deduplication).
- func FilterSlice[E any, T comparable](s []E, include func(E) (T, bool)) []T {
- filtered := make([]T, 0, len(s)) // slice will be clipped before returning
- seen := make(map[T]bool, len(s))
- for i := range s {
- if v, ok := include(s[i]); ok && !seen[v] {
- filtered = append(filtered, v)
- seen[v] = true
- }
- }
- return slices.Clip(filtered)
- }
|