From 9071518ffa16ff4d0d0e8d93490e67475a56cb61 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 18 Feb 2026 12:21:39 -0800 Subject: perf: memoize generic list derived data and folder grouping --- Sora/Views/Shared/FolderHierarchy.swift | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Sora/Views/Shared/FolderHierarchy.swift (limited to 'Sora/Views/Shared') diff --git a/Sora/Views/Shared/FolderHierarchy.swift b/Sora/Views/Shared/FolderHierarchy.swift new file mode 100644 index 0000000..99c4f8e --- /dev/null +++ b/Sora/Views/Shared/FolderHierarchy.swift @@ -0,0 +1,44 @@ +import Foundation + +struct FolderHierarchy { + private let foldersByIdentifier: [UUID: SettingsFolder] + private let folderNames: Set + private let nestedFoldersByTopLevelName: [String: [SettingsFolder]] + let rootFolders: [SettingsFolder] + + var sortedTopLevelNames: [String] { + nestedFoldersByTopLevelName.keys.sorted() + } + + init(folders: [SettingsFolder]) { + foldersByIdentifier = Dictionary(uniqueKeysWithValues: folders.map { ($0.id, $0) }) + folderNames = Set(folders.map(\.name)) + + var rootFolders: [SettingsFolder] = [] + var nestedFoldersByTopLevelName: [String: [SettingsFolder]] = [:] + + for folder in folders { + guard let topLevelName = folder.topLevelName else { + rootFolders.append(folder) + continue + } + + nestedFoldersByTopLevelName[topLevelName, default: []].append(folder) + } + + self.rootFolders = rootFolders + self.nestedFoldersByTopLevelName = nestedFoldersByTopLevelName + } + + func folder(for identifier: UUID) -> SettingsFolder? { + foldersByIdentifier[identifier] + } + + func folders(forTopLevelName topLevelName: String) -> [SettingsFolder] { + nestedFoldersByTopLevelName[topLevelName] ?? [] + } + + func hasTopLevelUncategorized(forTopLevelName topLevelName: String) -> Bool { + folderNames.contains(topLevelName) + } +} -- cgit v1.2.3