Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. final class ExtremeSportsTermsModel: CustomStringConvertible {
  2.  
  3. let term: String
  4.  
  5. var description: String {
  6. return term
  7. }
  8.  
  9. init(term: String) {
  10. self.term = term
  11. }
  12.  
  13. }
  14.  
  15. final class RelatedFlipsRepository {
  16.  
  17. enum Action {
  18. case add
  19. case remove
  20. }
  21.  
  22. private var relations: [String: Set<String>] = [:]
  23. var flips: [ExtremeSportsTermsModel] = []
  24.  
  25. init(flips: [ExtremeSportsTermsModel]) {
  26. self.flips = flips
  27. }
  28.  
  29. // MARK: - Public
  30.  
  31. func addFlip(_ flip: ExtremeSportsTermsModel, relatedTo related: [ExtremeSportsTermsModel] = []) {
  32. if !flips.contains(where: { $0.term == flip.term }) {
  33. flips.append(flip)
  34. }
  35.  
  36. configureRelated(related, flip: flip, action: .add)
  37. }
  38.  
  39. func getRelated(to flip: ExtremeSportsTermsModel) -> [ExtremeSportsTermsModel] {
  40. guard let values = relations[flip.term], !values.isEmpty else { return [] }
  41. return flips.filter({ values.contains($0.term) })
  42. }
  43.  
  44. func configureRelated(_ related: [ExtremeSportsTermsModel], flip: ExtremeSportsTermsModel, action: Action) {
  45. switch action {
  46. case .add:
  47. addRelated(related, to: flip)
  48. related.forEach({ addRelated([flip], to: $0) })
  49.  
  50. case .remove:
  51. removeRelated(related, from: flip)
  52. related.forEach({ removeRelated([flip], from: $0) })
  53. }
  54.  
  55. }
  56.  
  57. // MARK: - Private
  58.  
  59. private func addRelated(_ related: [ExtremeSportsTermsModel], to flip: ExtremeSportsTermsModel) {
  60. if !related.isEmpty {
  61. let relatedValues = related.map({ $0.term })
  62. if let values = relations[flip.term] {
  63. relations[flip.term] = values.union(relatedValues)
  64. } else {
  65. relations[flip.term] = Set(relatedValues)
  66. }
  67. }
  68. }
  69.  
  70. private func removeRelated(_ related: [ExtremeSportsTermsModel], from flip: ExtremeSportsTermsModel) {
  71. guard let values = relations[flip.term], !related.isEmpty else { return }
  72. relations[flip.term] = values.subtracting(related.map({ $0.term }))
  73. }
  74.  
  75. }
  76.  
  77. let ollie = ExtremeSportsTermsModel(term: "Ollie")
  78. let shuvit = ExtremeSportsTermsModel(term: "Shuvit")
  79. let acidDrop = ExtremeSportsTermsModel(term: "Acid Drop")
  80.  
  81. let repository = RelatedFlipsRepository(flips: [ollie, shuvit, acidDrop])
  82.  
  83. repository.configureRelated([acidDrop, shuvit], flip: ollie, action: .add)
  84. print(repository.getRelated(to: ollie)) // [Shuvit, Acid Drop]
  85. print(repository.getRelated(to: acidDrop)) // [Ollie]
  86.  
  87. repository.configureRelated([acidDrop], flip: ollie, action: .remove)
  88. print(repository.getRelated(to: ollie)) // [Shuvit]
  89. print(repository.getRelated(to: acidDrop)) // []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement