import Foundation final class UnsentMessageHistoryView { var ids: Set init(ids: [MessageId]) { self.ids = Set(ids) } func refreshDueToExternalTransaction(fetchUnsentMessageIds: () -> [MessageId]) -> Bool { let ids = Set(fetchUnsentMessageIds()) if ids != self.ids { self.ids = ids return true } else { return false } } func replay(_ operations: [IntermediateMessageHistoryUnsentOperation]) -> Bool { var updated = false for operation in operations { switch operation { case let .Insert(id): if !self.ids.contains(id) { self.ids.insert(id) updated = true } case let .Remove(id): if self.ids.contains(id) { self.ids.remove(id) updated = true } } } return updated } }