From 59c2b8eea33a1853b9aa4a5e17138d0857337d18 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 14 Jun 2025 08:20:48 -0700 Subject: feat: Development commit --- Sora/Views/SearchSuggestionsView.swift | 47 +++++++++++++++++----------------- 1 file 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 + let names: [String] + } + var items: [Either] @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] { - let matchCanidateTag = lastSearchTag + let matchCandidateTag = lastSearchTag let matchingTagsLimit = 50 - guard !matchCanidateTag.isEmpty else { return [] } + guard !matchCandidateTag.isEmpty else { return [] } var seenTags = Set() var matchingTags: [Either] = [] 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 } } } -- cgit v1.2.3