From 0c17ac3f8d2d1bf7e69df5c161ec1890d55b7b87 Mon Sep 17 00:00:00 2001 From: Michael Manganiello Date: Sun, 17 Mar 2024 13:44:17 -0300 Subject: [PATCH] misc: Add FilterMapSlice util For the scenarios where both `Filter` and `Map` are being applied, having this util should be faster, as it avoids the creation of an extra slice during the intermediate step. --- sharedutil/sharedutil.go | 13 +++++++++++++ ui/util/tracklistutil.go | 14 ++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/sharedutil/sharedutil.go b/sharedutil/sharedutil.go index 4e6e4e82..07f0e60c 100644 --- a/sharedutil/sharedutil.go +++ b/sharedutil/sharedutil.go @@ -31,6 +31,19 @@ func MapSlice[T any, U any](ts []T, f func(T) U) []U { return result } +func FilterMapSlice[T any, U any](ts []T, f func(T) (U, bool)) []U { + if ts == nil { + return nil + } + result := make([]U, 0) + for _, t := range ts { + if u, ok := f(t); ok { + result = append(result, u) + } + } + return result +} + func Reversed[T any](ts []T) []T { if ts == nil { return nil diff --git a/ui/util/tracklistutil.go b/ui/util/tracklistutil.go index 08da6d01..06013298 100644 --- a/ui/util/tracklistutil.go +++ b/ui/util/tracklistutil.go @@ -18,21 +18,15 @@ func ToTrackListModels(trs []*mediaprovider.Track) []*TrackListModel { }) } -func SelectedTrackModels(tracks []*TrackListModel) []*TrackListModel { - return sharedutil.FilterSlice(tracks, func(tm *TrackListModel) bool { - return tm.Selected - }) -} - func SelectedTracks(tracks []*TrackListModel) []*mediaprovider.Track { - return sharedutil.MapSlice(SelectedTrackModels(tracks), func(tm *TrackListModel) *mediaprovider.Track { - return tm.Track + return sharedutil.FilterMapSlice(tracks, func(tm *TrackListModel) (*mediaprovider.Track, bool) { + return tm.Track, tm.Selected }) } func SelectedTrackIDs(tracks []*TrackListModel) []string { - return sharedutil.MapSlice(SelectedTrackModels(tracks), func(tm *TrackListModel) string { - return tm.Track.ID + return sharedutil.FilterMapSlice(tracks, func(tm *TrackListModel) (string, bool) { + return tm.Track.ID, tm.Selected }) }