From 4c9cd6c8e61ff18ef036f128b47645e4de21d424 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:40:27 +0000 Subject: [PATCH] use emojirow in trietestingview extract trietestingview --- StickerSlack.xcodeproj/project.pbxproj | 10 ++- StickerSlack/Emoji/Trie.swift | 86 ------------------------ StickerSlack/Emoji/TrieTestingView.swift | 81 ++++++++++++++++++++++ 3 files changed, 89 insertions(+), 88 deletions(-) create mode 100644 StickerSlack/Emoji/TrieTestingView.swift diff --git a/StickerSlack.xcodeproj/project.pbxproj b/StickerSlack.xcodeproj/project.pbxproj index 3408eca..f16ce1a 100644 --- a/StickerSlack.xcodeproj/project.pbxproj +++ b/StickerSlack.xcodeproj/project.pbxproj @@ -44,12 +44,14 @@ A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9BBC5172EB8FA4500FFE82F /* ViewModifiers.swift */; }; A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; }; A9C172DD2EB8C9AC008A7885 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; }; - A9C172DE2EB8C9AC008A7885 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; }; A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D15B892EB1142C00404792 /* EmojiPack.swift */; }; A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */; }; A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72462EB948C400658CEB /* EmojiRow.swift */; }; A9EB72492EB948C400658CEB /* EmojiRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72462EB948C400658CEB /* EmojiRow.swift */; }; A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */; }; + A9EB724B2EB94A5700658CEB /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; }; + A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB724C2EB94A6B00658CEB /* TrieTestingView.swift */; }; + A9EB724F2EB94A6B00658CEB /* TrieTestingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB724C2EB94A6B00658CEB /* TrieTestingView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -114,6 +116,7 @@ A9E2ECD72EB74CE00038B2D6 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiCollectionView.swift; sourceTree = ""; }; A9EB72462EB948C400658CEB /* EmojiRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiRow.swift; sourceTree = ""; }; + A9EB724C2EB94A6B00658CEB /* TrieTestingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrieTestingView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -218,6 +221,7 @@ A9C172DB2EB8C9AC008A7885 /* Trie.swift */, A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */, A9EB72462EB948C400658CEB /* EmojiRow.swift */, + A9EB724C2EB94A6B00658CEB /* TrieTestingView.swift */, ); path = Emoji; sourceTree = ""; @@ -407,6 +411,7 @@ A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */, A935437B2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */, A9C172DD2EB8C9AC008A7885 /* Trie.swift in Sources */, + A9EB724F2EB94A6B00658CEB /* TrieTestingView.swift in Sources */, A924C3732EA9127200F20781 /* Emoji.swift in Sources */, A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */, A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */, @@ -421,10 +426,10 @@ buildActionMask = 2147483647; files = ( A986A6C32EB6598100B6E0FA /* FilterCategory.swift in Sources */, + A9EB724B2EB94A5700658CEB /* Trie.swift in Sources */, A986A6CD2EB659E000B6E0FA /* MessagesViewController.swift in Sources */, A986A6CE2EB659E000B6E0FA /* StickerBrowserDataSource.swift in Sources */, A9BBC5192EB8FA4500FFE82F /* ViewModifiers.swift in Sources */, - A9C172DE2EB8C9AC008A7885 /* Trie.swift in Sources */, A986A6C42EB6598500B6E0FA /* SlackResponse.swift in Sources */, A986A6C22EB6597600B6E0FA /* Emoji.swift in Sources */, A986A6C12EB6595F00B6E0FA /* EmojiHoarder.swift in Sources */, @@ -439,6 +444,7 @@ A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */, A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */, A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */, + A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */, A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */, A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */, A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */, diff --git a/StickerSlack/Emoji/Trie.swift b/StickerSlack/Emoji/Trie.swift index 9d6357f..501f6be 100644 --- a/StickerSlack/Emoji/Trie.swift +++ b/StickerSlack/Emoji/Trie.swift @@ -78,89 +78,3 @@ class Trie: ObservableObject { return results } } - -struct TrieTestingView: View { - @ObservedObject var hoarder: EmojiHoarder = EmojiHoarder(localOnly: true) -// @ObservedObject var trie: Trie = Trie() - - @State var id: UUID = UUID() - - @State var newWord: String = "hello" - - @State var searchTerm: String = "" - @State var searchStatus: Bool? = nil - - @State var filterTerm: String = "" - @State var filterResult: [String] = [] - - var body: some View { - VStack { - Button("reset", role: .destructive) { - hoarder.trie.root = TrieNode() - } - Button("add emojis!") { - hoarder.buildTrie() -// let start = Date().timeIntervalSince1970 -// for emoji in hoarder.emojis { -// hoarder.trie.insert(word: emoji.name, emoji: emoji) -// } -// hoarder.buildTrieDict() -// print("done!", Date().timeIntervalSince1970-start) - } - .buttonStyle(.borderedProminent) - - TextField("", text: $searchTerm) - .textFieldStyle(.roundedBorder) - .border(.orange) - .onChange(of: searchTerm) { _ in - searchStatus = hoarder.trie.search(for: searchTerm) - } - if let searchStatus { - Circle() - .frame(width: 20, height: 20) - .foregroundStyle(searchStatus ? .green : .red) - } - - TextField("", text: $filterTerm) - .textFieldStyle(.roundedBorder) - .border(.orange) - .onChange(of: filterTerm) { _ in - withAnimation { filterResult = hoarder.trie.search(prefix: filterTerm) } - } - Text("\(filterResult.count)") - .modifier(numericTextCompat()) - - List(filterResult, id: \.self) { item in - Text(item) - HStack { - AsyncImage(url: hoarder.trie.dict[item]!.localImageURL) - .frame(width: 20, height: 20) - AsyncImage(url: hoarder.trie.dict[item]!.remoteImageURL) - .frame(width: 20, height: 20) - } - } - - Text("\(hoarder.trie.root.children.count)") - } - } -} - -struct TrieNodeView: View { - @ObservedObject var trie: Trie - @State var trieNode: TrieNode - - var body: some View { - ForEach(trieNode.children.map { $0.key }, id: \.self) { key in - let node = trieNode.children[key]! - Text(String(key)) - .foregroundStyle(node.isEndOfWord ? .red : .primary) - .frame(width: 20, height: 20) - TrieNodeView(trie: trie, trieNode: node) - .padding(.leading, 20) - } - } -} - -#Preview { - TrieTestingView() -} diff --git a/StickerSlack/Emoji/TrieTestingView.swift b/StickerSlack/Emoji/TrieTestingView.swift new file mode 100644 index 0000000..27ac21b --- /dev/null +++ b/StickerSlack/Emoji/TrieTestingView.swift @@ -0,0 +1,81 @@ +// +// TrieTestingView.swift +// StickerSlack +// +// Created by neon443 on 03/11/2025. +// + +import SwiftUI + +struct TrieTestingView: View { + @ObservedObject var hoarder: EmojiHoarder = EmojiHoarder(localOnly: true) + + @State var id: UUID = UUID() + + @State var newWord: String = "hello" + + @State var searchTerm: String = "" + @State var searchStatus: Bool? = nil + + @State var filterTerm: String = "" + @State var filterResult: [String] = [] + + var body: some View { + VStack { + Button("reset", role: .destructive) { + hoarder.trie.root = TrieNode() + } + Button("add emojis!") { + hoarder.buildTrie() + } + .buttonStyle(.borderedProminent) + + TextField("", text: $searchTerm) + .textFieldStyle(.roundedBorder) + .border(.orange) + .onChange(of: searchTerm) { _ in + searchStatus = hoarder.trie.search(for: searchTerm) + } + if let searchStatus { + Circle() + .frame(width: 20, height: 20) + .foregroundStyle(searchStatus ? .green : .red) + } + + TextField("", text: $filterTerm) + .textFieldStyle(.roundedBorder) + .border(.orange) + .onChange(of: filterTerm) { _ in + withAnimation { filterResult = hoarder.trie.search(prefix: filterTerm) } + } + Text("\(filterResult.count)") + .modifier(numericTextCompat()) + + List(filterResult, id: \.self) { item in + EmojiRow(hoarder: hoarder, emoji: hoarder.trie.dict[item]!) + } + + Text("\(hoarder.trie.root.children.count)") + } + } +} + +struct TrieNodeView: View { + @ObservedObject var trie: Trie + @State var trieNode: TrieNode + + var body: some View { + ForEach(trieNode.children.map { $0.key }, id: \.self) { key in + let node = trieNode.children[key]! + Text(String(key)) + .foregroundStyle(node.isEndOfWord ? .red : .primary) + .frame(width: 20, height: 20) + TrieNodeView(trie: trie, trieNode: node) + .padding(.leading, 20) + } + } +} + +#Preview { + TrieTestingView() +}