import Foundation final class MutableMessageGroupView: MutablePostboxView { fileprivate let id: MessageId fileprivate let groupingKey: Int64? fileprivate var messages: [Message] = [] init(postbox: PostboxImpl, id: MessageId) { self.id = id self.messages = postbox.getMessageGroup(at: id) ?? [] self.groupingKey = self.messages.first?.groupingKey } func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool { var updated = false if let operations = transaction.currentOperationsByPeerId[self.id.peerId] { outer: for operation in operations { switch operation { case let .InsertMessage(message): if let groupingKey = self.groupingKey, message.groupingKey == groupingKey { updated = true break outer } else if message.id == self.id { updated = true break outer } case let .Remove(indices): for index in indices { for message in self.messages { if index.0.id == message.id { updated = true break outer } } } default: break } } } if updated { self.messages = postbox.getMessageGroup(at: self.id) ?? [] return true } else { return false } } func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool { return false } func immutableView() -> PostboxView { return MessageGroupView(self) } } public final class MessageGroupView: PostboxView { public let messages: [Message] init(_ view: MutableMessageGroupView) { self.messages = view.messages } }