89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package common
|
|
|
|
import "sort"
|
|
|
|
type albumLessFunc func(p1, p2 *Album) bool
|
|
|
|
type albumSorter struct {
|
|
albums []*Album
|
|
less []albumLessFunc
|
|
}
|
|
|
|
func (s *albumSorter) Len() int {
|
|
return len(s.albums)
|
|
}
|
|
|
|
func (s *albumSorter) Swap(i, j int) {
|
|
s.albums[i], s.albums[j] = s.albums[j], s.albums[i]
|
|
}
|
|
|
|
func (s *albumSorter) Less(i, j int) bool {
|
|
p, q := s.albums[i], s.albums[j]
|
|
|
|
var k int
|
|
for k = 0; k < len(s.less)-1; k++ {
|
|
less := s.less[k]
|
|
switch {
|
|
case less(p, q):
|
|
return true
|
|
case less(q, p):
|
|
return false
|
|
}
|
|
}
|
|
|
|
return s.less[k](p, q)
|
|
}
|
|
|
|
func (s *albumSorter) Sort(albums []*Album) {
|
|
s.albums = albums
|
|
sort.Sort(s)
|
|
}
|
|
|
|
func OrderAlbumBy(less ...albumLessFunc) *albumSorter {
|
|
return &albumSorter{
|
|
less: less,
|
|
}
|
|
}
|
|
|
|
func SortAlbums(album []*Album, field string) {
|
|
title := orderAlbumByTitle
|
|
artists := orderAlbumByArtists
|
|
years := orderAlbumByYears
|
|
modified := orderAlbumByModified
|
|
|
|
var sorter *albumSorter
|
|
switch field {
|
|
case "artist":
|
|
sorter = OrderAlbumBy(artists, title, years, modified)
|
|
case "year":
|
|
sorter = OrderAlbumBy(years, title, artists, modified)
|
|
case "modified":
|
|
sorter = OrderAlbumBy(modified, title, artists, years)
|
|
default:
|
|
sorter = OrderAlbumBy(title, artists, years, modified)
|
|
}
|
|
|
|
sorter.Sort(album)
|
|
}
|
|
|
|
func orderAlbumByTitle(c1, c2 *Album) bool {
|
|
return c1.Title() < c2.Title()
|
|
}
|
|
|
|
func orderAlbumByArtists(left, right *Album) bool {
|
|
if len(left.Artists()) > 0 && len(right.Artists()) > 0 {
|
|
return left.Artists()[0] < right.Artists()[0]
|
|
}
|
|
return false
|
|
}
|
|
|
|
func orderAlbumByYears(c1, c2 *Album) bool {
|
|
if len(c1.Dates()) > 0 && len(c2.Dates()) > 0 {
|
|
return c1.Dates()[0] < c2.Dates()[0]
|
|
}
|
|
return false
|
|
}
|
|
|
|
func orderAlbumByModified(c1, c2 *Album) bool {
|
|
return c1.LastModified().Before(c2.LastModified())
|
|
}
|