refactor: make ReorderItems generic

This commit is contained in:
Drew Weymouth
2024-06-01 10:42:31 -07:00
parent 3d6bd910f2
commit efcfe2a99f
4 changed files with 19 additions and 76 deletions
+12 -69
View File
@@ -115,67 +115,10 @@ const (
MoveDown MoveDown
) )
// TODO: it's a shame the below function is just duplicated for a slice of mediaprovider.MediaItem // Reorder items and return a new track slice.
// Find out if there's a better way with refactoring.
// Reorder tracks and return a new track slice.
// idxToMove must contain only valid indexes into tracks, and no repeats // idxToMove must contain only valid indexes into tracks, and no repeats
func ReorderTracks(tracks []*mediaprovider.Track, idxToMove []int, op TrackReorderOp) []*mediaprovider.Track { func ReorderItems[T any](items []T, idxToMove []int, op TrackReorderOp) []T {
newTracks := make([]*mediaprovider.Track, len(tracks)) newItems := make([]T, len(items))
switch op {
case MoveToTop:
topIdx := 0
botIdx := len(idxToMove)
idxToMoveSet := ToSet(idxToMove)
for i, t := range tracks {
if _, ok := idxToMoveSet[i]; ok {
newTracks[topIdx] = t
topIdx++
} else {
newTracks[botIdx] = t
botIdx++
}
}
case MoveToBottom:
topIdx := 0
botIdx := len(tracks) - len(idxToMove)
idxToMoveSet := ToSet(idxToMove)
for i, t := range tracks {
if _, ok := idxToMoveSet[i]; ok {
newTracks[botIdx] = t
botIdx++
} else {
newTracks[topIdx] = t
topIdx++
}
}
case MoveUp:
first := firstIdxCanMoveUp(idxToMove)
copy(newTracks, tracks)
for _, i := range idxToMove {
if i < first {
continue
}
newTracks[i-1], newTracks[i] = newTracks[i], newTracks[i-1]
}
case MoveDown:
last := lastIdxCanMoveDown(idxToMove, len(tracks))
copy(newTracks, tracks)
for i := len(idxToMove) - 1; i >= 0; i-- {
idx := idxToMove[i]
if idx > last {
continue
}
newTracks[idx+1], newTracks[idx] = newTracks[idx], newTracks[idx+1]
}
}
return newTracks
}
// Reorder media items and return a new item slice.
// idxToMove must contain only valid indexes into items, and no repeats
func ReorderMediaItems(items []mediaprovider.MediaItem, idxToMove []int, op TrackReorderOp) []mediaprovider.MediaItem {
newTracks := make([]mediaprovider.MediaItem, len(items))
switch op { switch op {
case MoveToTop: case MoveToTop:
topIdx := 0 topIdx := 0
@@ -183,10 +126,10 @@ func ReorderMediaItems(items []mediaprovider.MediaItem, idxToMove []int, op Trac
idxToMoveSet := ToSet(idxToMove) idxToMoveSet := ToSet(idxToMove)
for i, t := range items { for i, t := range items {
if _, ok := idxToMoveSet[i]; ok { if _, ok := idxToMoveSet[i]; ok {
newTracks[topIdx] = t newItems[topIdx] = t
topIdx++ topIdx++
} else { } else {
newTracks[botIdx] = t newItems[botIdx] = t
botIdx++ botIdx++
} }
} }
@@ -196,34 +139,34 @@ func ReorderMediaItems(items []mediaprovider.MediaItem, idxToMove []int, op Trac
idxToMoveSet := ToSet(idxToMove) idxToMoveSet := ToSet(idxToMove)
for i, t := range items { for i, t := range items {
if _, ok := idxToMoveSet[i]; ok { if _, ok := idxToMoveSet[i]; ok {
newTracks[botIdx] = t newItems[botIdx] = t
botIdx++ botIdx++
} else { } else {
newTracks[topIdx] = t newItems[topIdx] = t
topIdx++ topIdx++
} }
} }
case MoveUp: case MoveUp:
first := firstIdxCanMoveUp(idxToMove) first := firstIdxCanMoveUp(idxToMove)
copy(newTracks, items) copy(newItems, items)
for _, i := range idxToMove { for _, i := range idxToMove {
if i < first { if i < first {
continue continue
} }
newTracks[i-1], newTracks[i] = newTracks[i], newTracks[i-1] newItems[i-1], newItems[i] = newItems[i], newItems[i-1]
} }
case MoveDown: case MoveDown:
last := lastIdxCanMoveDown(idxToMove, len(items)) last := lastIdxCanMoveDown(idxToMove, len(items))
copy(newTracks, items) copy(newItems, items)
for i := len(idxToMove) - 1; i >= 0; i-- { for i := len(idxToMove) - 1; i >= 0; i-- {
idx := idxToMove[i] idx := idxToMove[i]
if idx > last { if idx > last {
continue continue
} }
newTracks[idx+1], newTracks[idx] = newTracks[idx], newTracks[idx+1] newItems[idx+1], newItems[idx] = newItems[idx], newItems[idx+1]
} }
} }
return newTracks return newItems
} }
func firstIdxCanMoveUp(idxs []int) int { func firstIdxCanMoveUp(idxs []int) int {
+5 -5
View File
@@ -7,7 +7,7 @@ import (
"github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/backend/mediaprovider"
) )
func Test_ReorderTracks(t *testing.T) { func Test_ReorderItems(t *testing.T) {
tracks := []*mediaprovider.Track{ tracks := []*mediaprovider.Track{
{ID: "a"}, // 0 {ID: "a"}, // 0
{ID: "b"}, // 1 {ID: "b"}, // 1
@@ -27,7 +27,7 @@ func Test_ReorderTracks(t *testing.T) {
{ID: "b"}, {ID: "b"},
{ID: "e"}, {ID: "e"},
} }
newTracks := ReorderTracks(tracks, idxToMove, MoveToTop) newTracks := ReorderItems(tracks, idxToMove, MoveToTop)
if !tracklistsEqual(t, newTracks, want) { if !tracklistsEqual(t, newTracks, want) {
t.Error("ReorderTracks: MoveToTop order incorrect") t.Error("ReorderTracks: MoveToTop order incorrect")
} }
@@ -42,7 +42,7 @@ func Test_ReorderTracks(t *testing.T) {
{ID: "c"}, {ID: "c"},
{ID: "f"}, {ID: "f"},
} }
newTracks = ReorderTracks(tracks, idxToMove, MoveToBottom) newTracks = ReorderItems(tracks, idxToMove, MoveToBottom)
if !tracklistsEqual(t, newTracks, want) { if !tracklistsEqual(t, newTracks, want) {
t.Error("ReorderTracks: MoveToBottom order incorrect") t.Error("ReorderTracks: MoveToBottom order incorrect")
} }
@@ -57,7 +57,7 @@ func Test_ReorderTracks(t *testing.T) {
{ID: "f"}, {ID: "f"},
{ID: "e"}, {ID: "e"},
} }
newTracks = ReorderTracks(tracks, idxToMove, MoveUp) newTracks = ReorderItems(tracks, idxToMove, MoveUp)
if !tracklistsEqual(t, newTracks, want) { if !tracklistsEqual(t, newTracks, want) {
t.Error("ReorderTracks: MoveUp order incorrect") t.Error("ReorderTracks: MoveUp order incorrect")
} }
@@ -72,7 +72,7 @@ func Test_ReorderTracks(t *testing.T) {
{ID: "e"}, {ID: "e"},
{ID: "f"}, {ID: "f"},
} }
newTracks = ReorderTracks(tracks, idxToMove, MoveDown) newTracks = ReorderItems(tracks, idxToMove, MoveDown)
if !tracklistsEqual(t, newTracks, want) { if !tracklistsEqual(t, newTracks, want) {
t.Error("ReorderTracks: MoveDown order incorrect") t.Error("ReorderTracks: MoveDown order incorrect")
} }
+1 -1
View File
@@ -462,7 +462,7 @@ func (a *NowPlayingPage) doSetNewTrackOrder(trackIDs []string, op sharedutil.Tra
idxs = append(idxs, i) idxs = append(idxs, i)
} }
} }
newTracks := sharedutil.ReorderMediaItems(a.queue, idxs, op) newTracks := sharedutil.ReorderItems(a.queue, idxs, op)
a.pm.UpdatePlayQueue(newTracks) a.pm.UpdatePlayQueue(newTracks)
} }
+1 -1
View File
@@ -187,7 +187,7 @@ func (a *PlaylistPage) doSetNewTrackOrder(op sharedutil.TrackReorderOp) {
idxs = append(idxs, i) idxs = append(idxs, i)
} }
} }
newTracks := sharedutil.ReorderTracks(a.tracks, idxs, op) newTracks := sharedutil.ReorderItems(a.tracks, idxs, op)
ids := sharedutil.TracksToIDs(newTracks) ids := sharedutil.TracksToIDs(newTracks)
if err := a.sm.Server.ReplacePlaylistTracks(a.playlistID, ids); err != nil { if err := a.sm.Server.ReplacePlaylistTracks(a.playlistID, ids); err != nil {
log.Printf("error updating playlist: %s", err.Error()) log.Printf("error updating playlist: %s", err.Error())