diff options
Diffstat (limited to 'Sora/Views/Shared')
| -rw-r--r-- | Sora/Views/Shared/FolderHierarchy.swift | 44 |
1 files changed, 44 insertions, 0 deletions
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<String> + 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) + } +} |