trying to otptimise shit 😭

trying to undo stuff from before
This commit is contained in:
neon443
2025-11-03 17:32:54 +00:00
parent 3272560f29
commit 72a9bb2933
4 changed files with 37 additions and 33 deletions

View File

@@ -71,6 +71,7 @@ struct Emoji: Codable, Identifiable, Hashable {
self.remoteImageURL = url self.remoteImageURL = url
} }
nonisolated
func downloadImage() async throws { func downloadImage() async throws {
if let data = try? await Data(contentsOf: localImageURL), if let data = try? await Data(contentsOf: localImageURL),
let uiimage = UIImage(data: data) { let uiimage = UIImage(data: data) {

View File

@@ -16,8 +16,9 @@ class TrieNode: ObservableObject {
class Trie: ObservableObject { class Trie: ObservableObject {
@Published var root: TrieNode = TrieNode() @Published var root: TrieNode = TrieNode()
@Published var dict: [String:Emoji] = [:]
func insert(word: String) { func insert(word: String, emoji: Emoji) {
let word = word.lowercased() let word = word.lowercased()
var currentNode = root var currentNode = root
let indices = word.indices let indices = word.indices
@@ -100,20 +101,12 @@ struct TrieTestingView: View {
Button("add emojis!") { Button("add emojis!") {
let start = Date().timeIntervalSince1970 let start = Date().timeIntervalSince1970
for emoji in hoarder.emojis { for emoji in hoarder.emojis {
trie.insert(word: emoji.name) trie.insert(word: emoji.name, emoji: emoji)
} }
print("done!", Date().timeIntervalSince1970-start) print("done!", Date().timeIntervalSince1970-start)
} }
.buttonStyle(.borderedProminent) .buttonStyle(.borderedProminent)
TextField("", text: $newWord)
.textFieldStyle(.roundedBorder)
.border(.red)
Button("add word") {
trie.insert(word: newWord)
id = UUID()
}
TextField("", text: $searchTerm) TextField("", text: $searchTerm)
.textFieldStyle(.roundedBorder) .textFieldStyle(.roundedBorder)
.border(.orange) .border(.orange)

View File

@@ -20,7 +20,7 @@ class EmojiHoarder: ObservableObject {
@Published var emojis: [Emoji] = [] @Published var emojis: [Emoji] = []
@Published var trie: Trie = Trie() @Published var trie: Trie = Trie()
@Published var filteredEmojis: [Emoji] = [] @Published var filteredEmojis: [String] = []
init(localOnly: Bool = false) { init(localOnly: Bool = false) {
let localDB = loadLocalDB() let localDB = loadLocalDB()
@@ -67,12 +67,23 @@ class EmojiHoarder: ObservableObject {
func buildTrie() { func buildTrie() {
let start = Date().timeIntervalSince1970 let start = Date().timeIntervalSince1970
trie.root = TrieNode()
for emoji in emojis { 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) 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 nonisolated
func loadLocalDB() -> [Emoji] { func loadLocalDB() -> [Emoji] {
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) { if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
@@ -110,18 +121,8 @@ class EmojiHoarder: ObservableObject {
} }
} }
// func filterEmojis(by searchTerm: String) { func filterEmojis(by searchTerm: String) {
// filteredEmojis = trie.search(prefix: searchTerm) withAnimation { 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(byCategory category: FilterCategory, searchTerm: String) { // func filterEmojis(byCategory category: FilterCategory, searchTerm: String) {

View File

@@ -42,8 +42,8 @@ struct ContentView: View {
Text("\(hoarder.filteredEmojis.count) Emoji") Text("\(hoarder.filteredEmojis.count) Emoji")
// if searchTerm.isEmpty { if searchTerm.isEmpty {
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in ForEach($hoarder.emojis, id: \.self) { $emoji in
HStack { HStack {
EmojiPreview( EmojiPreview(
hoarder: hoarder, hoarder: hoarder,
@@ -70,16 +70,25 @@ struct ContentView: View {
} }
} }
} }
// } else { } else {
// ForEach(hoarder.filteredEmojis, id: \.self) { name in ForEach(hoarder.filteredEmojis, id: \.self) { name in
// Text(name) 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") .navigationTitle("StickerSlack")
.onChange(of: searchTerm) { _ in .onChange(of: searchTerm) { _ in
// hoarder.filterEmojis(by: searchTerm) hoarder.filterEmojis(by: searchTerm)
hoarder.results(for: searchTerm)
} }
.refreshable { .refreshable {
Task.detached { Task.detached {