mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-08-20 03:27:52 +02:00
Many places have the following logic: ```go func (jobs ActionJobList) GetRunIDs() []int64 { ids := make(container.Set[int64], len(jobs)) for _, j := range jobs { if j.RunID == 0 { continue } ids.Add(j.RunID) } return ids.Values() } ``` this introduces a `container.FilterMapUnique` function, which reduces the code above to: ```go func (jobs ActionJobList) GetRunIDs() []int64 { return container.FilterMapUnique(jobs, func(j *ActionRunJob) (int64, bool) { return j.RunID, j.RunID != 0 }) } ``` Conflicts: models/issues/comment_list.go due to premature refactor in #3116
21 lines
679 B
Go
21 lines
679 B
Go
// 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)
|
|
}
|