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