diff options
Diffstat (limited to 'Sora/Views/SearchSuggestionsView.swift')
| -rw-r--r-- | Sora/Views/SearchSuggestionsView.swift | 47 |
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 } } } |