feat: use launch history to break search ranking ties

This commit is contained in:
2026-10-12 14:17:29 +02:00
parent a0a6f25c03
commit 0da8b8e241
5 changed files with 57 additions and 14 deletions
+9 -2
View File
@@ -89,8 +89,15 @@ public enum ApplicationCatalog {
public enum ApplicationSearch {
public static func results(for query: String, in applications: [Application]) -> [Application] {
results(for: query, in: applications, breakingTiesWith: alphabetical)
}
static func results(
for query: String, in applications: [Application],
breakingTiesWith preferred: (Application, Application) -> Bool
) -> [Application] {
let query = folded(query.trimmingCharacters(in: .whitespacesAndNewlines))
guard !query.isEmpty else { return applications.sorted(by: alphabetical) }
guard !query.isEmpty else { return applications.sorted(by: preferred) }
let characters = Array(query)
var ranked = applications.compactMap { application -> (Application, Rank)? in
let name = application.searchableName
@@ -110,7 +117,7 @@ public enum ApplicationSearch {
}
ranked.sort { lhs, rhs in
if lhs.1 != rhs.1 { return lhs.1 < rhs.1 }
return alphabetical(lhs.0, rhs.0)
return preferred(lhs.0, rhs.0)
}
return ranked.map(\.0)
}