Changeset.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // Changeset.swift
  3. // RxDataSources
  4. //
  5. // Created by Krunoslav Zaher on 5/30/15.
  6. // Copyright © 2015 Krunoslav Zaher. All rights reserved.
  7. //
  8. import Foundation
  9. public struct Changeset<Section: SectionModelType> {
  10. public typealias Item = Section.Item
  11. public let reloadData: Bool
  12. public let originalSections: [Section]
  13. public let finalSections: [Section]
  14. public let insertedSections: [Int]
  15. public let deletedSections: [Int]
  16. public let movedSections: [(from: Int, to: Int)]
  17. public let updatedSections: [Int]
  18. public let insertedItems: [ItemPath]
  19. public let deletedItems: [ItemPath]
  20. public let movedItems: [(from: ItemPath, to: ItemPath)]
  21. public let updatedItems: [ItemPath]
  22. init(reloadData: Bool = false,
  23. originalSections: [Section] = [],
  24. finalSections: [Section] = [],
  25. insertedSections: [Int] = [],
  26. deletedSections: [Int] = [],
  27. movedSections: [(from: Int, to: Int)] = [],
  28. updatedSections: [Int] = [],
  29. insertedItems: [ItemPath] = [],
  30. deletedItems: [ItemPath] = [],
  31. movedItems: [(from: ItemPath, to: ItemPath)] = [],
  32. updatedItems: [ItemPath] = []) {
  33. self.reloadData = reloadData
  34. self.originalSections = originalSections
  35. self.finalSections = finalSections
  36. self.insertedSections = insertedSections
  37. self.deletedSections = deletedSections
  38. self.movedSections = movedSections
  39. self.updatedSections = updatedSections
  40. self.insertedItems = insertedItems
  41. self.deletedItems = deletedItems
  42. self.movedItems = movedItems
  43. self.updatedItems = updatedItems
  44. }
  45. public static func initialValue(_ sections: [Section]) -> Changeset<Section> {
  46. return Changeset<Section>(
  47. reloadData: true,
  48. finalSections: sections,
  49. insertedSections: Array(0 ..< sections.count) as [Int]
  50. )
  51. }
  52. }
  53. extension ItemPath
  54. : CustomDebugStringConvertible {
  55. public var debugDescription : String {
  56. return "(\(sectionIndex), \(itemIndex))"
  57. }
  58. }
  59. extension Changeset
  60. : CustomDebugStringConvertible {
  61. public var debugDescription : String {
  62. let serializedSections = "[\n" + finalSections.map { "\($0)" }.joined(separator: ",\n") + "\n]\n"
  63. return " >> Final sections"
  64. + " \n\(serializedSections)"
  65. + (!insertedSections.isEmpty || !deletedSections.isEmpty || !movedSections.isEmpty || !updatedSections.isEmpty ? "\nSections:" : "")
  66. + (!insertedSections.isEmpty ? "\ninsertedSections:\n\t\(insertedSections)" : "")
  67. + (!deletedSections.isEmpty ? "\ndeletedSections:\n\t\(deletedSections)" : "")
  68. + (!movedSections.isEmpty ? "\nmovedSections:\n\t\(movedSections)" : "")
  69. + (!updatedSections.isEmpty ? "\nupdatesSections:\n\t\(updatedSections)" : "")
  70. + (!insertedItems.isEmpty || !deletedItems.isEmpty || !movedItems.isEmpty || !updatedItems.isEmpty ? "\nItems:" : "")
  71. + (!insertedItems.isEmpty ? "\ninsertedItems:\n\t\(insertedItems)" : "")
  72. + (!deletedItems.isEmpty ? "\ndeletedItems:\n\t\(deletedItems)" : "")
  73. + (!movedItems.isEmpty ? "\nmovedItems:\n\t\(movedItems)" : "")
  74. + (!updatedItems.isEmpty ? "\nupdatedItems:\n\t\(updatedItems)" : "")
  75. }
  76. }