import Foundation final class MutableMessagesView: MutablePostboxView { fileprivate let ids: Set private let peerIds: Set fileprivate var messages: [MessageId: Message] = [:] init(postbox: PostboxImpl, ids: Set) { self.ids = ids self.peerIds = Set(ids.map { $0.peerId }) for id in ids { if let message = postbox.getMessage(id) { self.messages[message.id] = message } } } func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool { var updatedIds = Set() for peerId in self.peerIds { if let operations = transaction.currentOperationsByPeerId[peerId] { for operation in operations { switch operation { case let .InsertMessage(message): if self.ids.contains(message.id) { updatedIds.insert(message.id) } case let .Remove(indices): for index in indices { if self.ids.contains(index.0.id) { updatedIds.insert(index.0.id) } } default: break } } } } if !updatedIds.isEmpty { for id in updatedIds { if let message = postbox.getMessage(id) { self.messages[message.id] = message } else { self.messages.removeValue(forKey: id) } } return true } else { return false } } func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool { return false } func immutableView() -> PostboxView { return MessagesView(self) } } public final class MessagesView: PostboxView { public var messages: [MessageId: Message] = [:] init(_ view: MutableMessagesView) { self.messages = view.messages } }