summaryrefslogtreecommitdiff
path: root/Sora/Views/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views/Shared')
-rw-r--r--Sora/Views/Shared/FolderHierarchy.swift44
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)
+ }
+}