perf(07-01): add incremental persistence helpers for queue mutations

- Add persistAddTrack/persistAddTracks for O(1) append operations
- Add persistInsertTracks with variable-N position shift for insert-at operations
- Add persistRemoveTrack with single DELETE + position shift
- Wire AddTrack/AddTracks to use incremental INSERT (no full table rewrite)
- Wire InsertNext/InsertNextTracks/InsertTracksAt to use position shift + INSERT
- Wire RemoveTrack to use single DELETE + shift (no full table rewrite)
- RemoveTracks keeps full persistTracks rewrite (bulk operation per design)
- Preserve shuffle order regeneration in all mutation paths
This commit is contained in:
2026-03-04 20:57:47 -05:00
parent cd98ad6dc8
commit cdd17db275
2 changed files with 233 additions and 7 deletions
+52 -7
View File
@@ -343,7 +343,12 @@ func (q *Queue) AddTrack(filePath string) {
q.loadCurrentTrack()
}
q.commitMutation(false)
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistAddTrack(track)
q.persistState()
q.emitTracksModified(
"add",
[]Track{track},
@@ -388,7 +393,12 @@ func (q *Queue) AddTracks(filePaths []string) {
q.loadCurrentTrack()
}
q.commitMutation(false)
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistAddTracks(newTracks)
q.persistState()
q.emitTracksModified(
"add",
newTracks,
@@ -439,7 +449,14 @@ func (q *Queue) InsertNextTracks(filePaths []string) {
q.loadCurrentTrack()
}
q.commitMutation(true)
q.reindexPositions()
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistInsertTracks(newTracks, insertPos)
q.persistState()
q.emitTracksModified(
"insert",
newTracks,
@@ -482,7 +499,14 @@ func (q *Queue) InsertNext(filePath string) {
q.loadCurrentTrack()
}
q.commitMutation(true)
q.reindexPositions()
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistInsertTracks([]Track{track}, insertPos)
q.persistState()
q.emitTracksModified(
"insert",
[]Track{track},
@@ -542,7 +566,14 @@ func (q *Queue) InsertTracksAt(filePaths []string, index int) {
q.loadCurrentTrack()
}
q.commitMutation(true)
q.reindexPositions()
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistInsertTracks(newTracks, index)
q.persistState()
q.emitTracksModified(
"insert",
newTracks,
@@ -722,7 +753,14 @@ func (q *Queue) RemoveTrack(position int) {
q.currentIndex = len(q.tracks) - 1
}
q.commitMutation(true)
q.persistRemoveTrack(position)
q.reindexPositions()
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistState()
q.emitTracksModified(
"remove",
nil,
@@ -784,7 +822,14 @@ func (q *Queue) RemoveTracks(positions []int) {
}
}
q.commitMutation(true)
q.reindexPositions()
if q.shuffleMode {
q.generateShuffleOrder()
}
q.persistTracks()
q.persistState()
q.emitTracksModified(
"remove",
nil,