aboutsummaryrefslogtreecommitdiff
path: root/playlist.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2022-07-21 00:44:31 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2022-07-21 00:44:31 +0200
commit318fd2fda65e6a0a329a5fad5be3f81d54ccacff (patch)
tree936fdce042372b3a97a3256e560af79b773868a5 /playlist.go
downloadWRMS-318fd2fda65e6a0a329a5fad5be3f81d54ccacff.tar.gz
WRMS-318fd2fda65e6a0a329a5fad5be3f81d54ccacff.zip
initial WIP commit
Diffstat (limited to 'playlist.go')
-rw-r--r--playlist.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/playlist.go b/playlist.go
new file mode 100644
index 0000000..b37ab3d
--- /dev/null
+++ b/playlist.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "container/heap"
+)
+
+type Playlist []*Song
+
+func (pl Playlist) Len() int { return len(pl) }
+
+func (pl Playlist) Less(i, j int) bool {
+ return pl[i].Weight > pl[j].Weight
+}
+
+func (pl Playlist) Swap(i, j int) {
+ pl[i], pl[j] = pl[j], pl[i]
+ pl[i].index = i
+ pl[j].index = j
+}
+
+func (pl *Playlist) Push(x any) {
+ n := len(*pl)
+ song := x.(*Song)
+ song.index = n
+ *pl = append(*pl, song)
+}
+
+func (pl *Playlist) Pop() any {
+ old := *pl
+ n := len(old)
+ s := old[n-1]
+ old[n-1] = nil // avoid memory leak
+ s.index = -1 // for safety
+ *pl = old[0 : n-1]
+ return s
+}
+
+func (pl *Playlist) PopSong() *Song {
+ return heap.Pop(pl).(*Song)
+}
+
+func (pl *Playlist) Add(s *Song) {
+ heap.Push(pl, s)
+}
+
+func (pl *Playlist) Adjust(s *Song) {
+ heap.Fix(pl, s.index)
+}