From 72a9bb2933f1e2455952aa33d884bb270e7efa7c Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Mon, 3 Nov 2025 17:32:54 +0000 Subject: [PATCH] =?UTF-8?q?trying=20to=20otptimise=20shit=20=F0=9F=98=AD?= =?UTF-8?q?=20trying=20to=20undo=20stuff=20from=20before?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StickerSlack/Emoji/Emoji.swift | 1 + StickerSlack/Emoji/Trie.swift | 13 +++---------- StickerSlack/EmojiHoarder.swift | 29 ++++++++++++++-------------- StickerSlack/Views/ContentView.swift | 27 +++++++++++++++++--------- 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/StickerSlack/Emoji/Emoji.swift b/StickerSlack/Emoji/Emoji.swift index e994be4..32c4080 100644 --- a/StickerSlack/Emoji/Emoji.swift +++ b/StickerSlack/Emoji/Emoji.swift @@ -71,6 +71,7 @@ struct Emoji: Codable, Identifiable, Hashable { self.remoteImageURL = url } + nonisolated func downloadImage() async throws { if let data = try? await Data(contentsOf: localImageURL), let uiimage = UIImage(data: data) { diff --git a/StickerSlack/Emoji/Trie.swift b/StickerSlack/Emoji/Trie.swift index 2a8875a..7eaac74 100644 --- a/StickerSlack/Emoji/Trie.swift +++ b/StickerSlack/Emoji/Trie.swift @@ -16,8 +16,9 @@ class TrieNode: ObservableObject { class Trie: ObservableObject { @Published var root: TrieNode = TrieNode() + @Published var dict: [String:Emoji] = [:] - func insert(word: String) { + func insert(word: String, emoji: Emoji) { let word = word.lowercased() var currentNode = root let indices = word.indices @@ -100,20 +101,12 @@ struct TrieTestingView: View { Button("add emojis!") { let start = Date().timeIntervalSince1970 for emoji in hoarder.emojis { - trie.insert(word: emoji.name) + trie.insert(word: emoji.name, emoji: emoji) } print("done!", Date().timeIntervalSince1970-start) } .buttonStyle(.borderedProminent) - TextField("", text: $newWord) - .textFieldStyle(.roundedBorder) - .border(.red) - Button("add word") { - trie.insert(word: newWord) - id = UUID() - } - TextField("", text: $searchTerm) .textFieldStyle(.roundedBorder) .border(.orange) diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 540ca7f..64e387f 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -20,7 +20,7 @@ class EmojiHoarder: ObservableObject { @Published var emojis: [Emoji] = [] @Published var trie: Trie = Trie() - @Published var filteredEmojis: [Emoji] = [] + @Published var filteredEmojis: [String] = [] init(localOnly: Bool = false) { let localDB = loadLocalDB() @@ -67,12 +67,23 @@ class EmojiHoarder: ObservableObject { func buildTrie() { let start = Date().timeIntervalSince1970 + trie.root = TrieNode() for emoji in emojis { - trie.insert(word: emoji.name) + trie.insert(word: emoji.name, emoji: emoji) } + buildTrieDict() print("done building trie in", Date().timeIntervalSince1970-start) } + func buildTrieDict() { + var dict: [String:Emoji] = [:] + for emoji in emojis { + dict[emoji.name] = emoji + } + self.filteredEmojis = dict.map { $0.key } + self.trie.dict = dict + } + nonisolated func loadLocalDB() -> [Emoji] { if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) { @@ -110,18 +121,8 @@ class EmojiHoarder: ObservableObject { } } -// func filterEmojis(by searchTerm: String) { -// filteredEmojis = trie.search(prefix: searchTerm) -// } - - func results(for query: String) -> [Emoji] { - guard !query.isEmpty else { - filteredEmojis = emojis - return emojis - } - let names = Set(trie.search(prefix: query)) - filteredEmojis = emojis.filter { names.contains($0.name) } - return filteredEmojis + func filterEmojis(by searchTerm: String) { + withAnimation { filteredEmojis = trie.search(prefix: searchTerm) } } // func filterEmojis(byCategory category: FilterCategory, searchTerm: String) { diff --git a/StickerSlack/Views/ContentView.swift b/StickerSlack/Views/ContentView.swift index d634754..6bffeed 100644 --- a/StickerSlack/Views/ContentView.swift +++ b/StickerSlack/Views/ContentView.swift @@ -42,8 +42,8 @@ struct ContentView: View { Text("\(hoarder.filteredEmojis.count) Emoji") -// if searchTerm.isEmpty { - ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in + if searchTerm.isEmpty { + ForEach($hoarder.emojis, id: \.self) { $emoji in HStack { EmojiPreview( hoarder: hoarder, @@ -70,16 +70,25 @@ struct ContentView: View { } } } -// } else { -// ForEach(hoarder.filteredEmojis, id: \.self) { name in -// Text(name) -// } -// } + } else { + ForEach(hoarder.filteredEmojis, id: \.self) { name in + if let emoji = hoarder.trie.dict[name] { + EmojiPreview(hoarder: hoarder, emoji: emoji) + .onTapGesture { + Task.detached { + try? await hoarder.trie.dict[name]!.downloadImage() + await MainActor.run { + hoarder.trie.dict[name]!.refresh() + } + } + } + } + } + } } .navigationTitle("StickerSlack") .onChange(of: searchTerm) { _ in -// hoarder.filterEmojis(by: searchTerm) - hoarder.results(for: searchTerm) + hoarder.filterEmojis(by: searchTerm) } .refreshable { Task.detached {