32 lines
776 B
Go
32 lines
776 B
Go
package model
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/bjarneo/cliamp/internal/fuzzy"
|
|
)
|
|
|
|
// updateSearch filters the playlist by the current search query, ranking
|
|
// matches by fuzzy relevance (best match first).
|
|
func (m *Model) updateSearch() {
|
|
m.search.results = nil
|
|
m.search.cursor = 0
|
|
m.search.scroll = 0
|
|
if m.search.query == "" {
|
|
return
|
|
}
|
|
type match struct{ idx, score int }
|
|
matches := make([]match, 0, m.playlist.Len())
|
|
for i, t := range m.playlist.Tracks() {
|
|
if score, ok := fuzzy.Match(m.search.query, t.DisplayName()); ok {
|
|
matches = append(matches, match{i, score})
|
|
}
|
|
}
|
|
sort.SliceStable(matches, func(a, b int) bool {
|
|
return matches[a].score > matches[b].score
|
|
})
|
|
for _, mt := range matches {
|
|
m.search.results = append(m.search.results, mt.idx)
|
|
}
|
|
}
|