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
}
nonisolated
func downloadImage() async throws {
if let data = try? await Data(contentsOf: localImageURL),
let uiimage = UIImage(data: data) {

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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 {