summaryrefslogtreecommitdiff
path: root/Sora/Views/SearchSuggestionsView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views/SearchSuggestionsView.swift')
-rw-r--r--Sora/Views/SearchSuggestionsView.swift47
1 files changed, 24 insertions, 23 deletions
diff --git a/Sora/Views/SearchSuggestionsView.swift b/Sora/Views/SearchSuggestionsView.swift
index 2f2d572..d30303f 100644
--- a/Sora/Views/SearchSuggestionsView.swift
+++ b/Sora/Views/SearchSuggestionsView.swift
@@ -1,6 +1,11 @@
import SwiftUI
struct SearchSuggestionsView: View {
+ private struct CachedTag {
+ let original: Either<BooruTag, BooruSearchQuery>
+ let names: [String]
+ }
+
var items: [Either<BooruTag, BooruSearchQuery>]
@Binding var searchText: String
@@ -8,41 +13,37 @@ struct SearchSuggestionsView: View {
String(searchText.split(separator: " ").last ?? "").lowercased()
}
+ private var cachedTags: [CachedTag] {
+ items.map { item in
+ switch item {
+ case .left(let tag):
+ return CachedTag(original: item, names: [tag.name.lowercased()])
+
+ case .right(let query):
+ return CachedTag(original: item, names: query.tags.map { $0.lowercased() })
+ }
+ }
+ }
+
private var filteredItems: [Either<BooruTag, BooruSearchQuery>] {
- let matchCanidateTag = lastSearchTag
+ let matchCandidateTag = lastSearchTag
let matchingTagsLimit = 50
- guard !matchCanidateTag.isEmpty else { return [] }
+ guard !matchCandidateTag.isEmpty else { return [] }
var seenTags = Set<String>()
var matchingTags: [Either<BooruTag, BooruSearchQuery>] = []
matchingTags.reserveCapacity(matchingTagsLimit)
- for item in items {
+ for tag in cachedTags {
if matchingTags.count >= matchingTagsLimit { break }
- switch item {
- case .left(let tag):
- let lowercasedName = tag.name.lowercased()
+ for name in tag.names {
+ if name.contains(matchCandidateTag), seenTags.insert(name).inserted {
+ matchingTags.append(tag.original)
- if lowercasedName.contains(matchCanidateTag),
- seenTags.insert(lowercasedName).inserted
- {
- matchingTags.append(item)
- }
-
- case .right(let query):
- for tagName in query.tags {
- let lowercasedTagName = tagName.lowercased()
-
- if lowercasedTagName.contains(matchCanidateTag),
- seenTags.insert(lowercasedTagName).inserted
- {
- matchingTags.append(item)
-
- break
- }
+ break
}
}
}