summaryrefslogtreecommitdiff
path: root/Sora/Views/Shared/FolderHierarchy.swift
blob: 99c4f8ede8b35032a688f8576c25b89616c65140 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)
  }
}