summaryrefslogtreecommitdiffstats
path: root/modules/container/filter.go
blob: 37ec7c3d565520e4d450c24b341c9b023b7990a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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)
}