import SwiftUI struct SearchSuggestionsView: View { var items: [Either] @Binding var searchText: String private var lastSearchTag: String { String(searchText.split(separator: " ").last ?? "").lowercased() } private var filteredItems: [Either] { let matchCanidateTag = lastSearchTag let matchingTagsLimit = 50 guard !matchCanidateTag.isEmpty else { return [] } var seenTags = Set() var matchingTags: [Either] = [] matchingTags.reserveCapacity(matchingTagsLimit) for item in items { if matchingTags.count >= matchingTagsLimit { break } switch item { case .left(let tag): let lowercasedName = tag.name.lowercased() 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 } } } } return matchingTags } var body: some View { ForEach(filteredItems, id: \.self) { item in switch item { case .left(let tag): Button { if let range = searchText.range(of: lastSearchTag, options: .backwards) { searchText.replaceSubrange(range, with: tag.name) } } label: { Text(tag.name) } case .right(let query): Button { if let range = searchText.range(of: lastSearchTag, options: .backwards), let matchingTag = query.tags.first(where: { $0.lowercased().contains(lastSearchTag) }) { searchText.replaceSubrange(range, with: matchingTag) } } label: { if let matchingTag = query.tags.first(where: { $0.lowercased().contains(lastSearchTag) }) { Text(matchingTag) } else { Text(query.tags.first ?? "") } } } } } }