import Foundation final class MutableOrderedItemListView: MutablePostboxView { let collectionId: Int32 var items: [OrderedItemListEntry] init(postbox: PostboxImpl, collectionId: Int32) { self.collectionId = collectionId self.items = postbox.orderedItemListTable.getItems(collectionId: collectionId) } func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool { var updated = false if let operations = transaction.currentOrderedItemListOperations[self.collectionId] { for operation in operations { switch operation { case let .replace(items): self.items = items updated = true case let .addOrMoveToFirstPosition(item, maxCount): if let index = self.items.firstIndex(where: { $0.id == item.id }) { self.items.remove(at: index) self.items.insert(item, at: 0) } else { self.items.insert(item, at: 0) if let maxCount = maxCount, self.items.count > maxCount { self.items.removeLast() } } updated = true case let .remove(itemId): inner: for i in 0 ..< self.items.count { if self.items[i].id == itemId { self.items.remove(at: i) updated = true break inner } } case let .update(itemId, content): inner: for i in 0 ..< self.items.count { if self.items[i].id == itemId { self.items[i] = OrderedItemListEntry(id: itemId, contents: content) updated = true break inner } } } } } return updated } func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool { return false } func immutableView() -> PostboxView { return OrderedItemListView(self) } } public final class OrderedItemListView: PostboxView { public let collectionId: Int32 public let items: [OrderedItemListEntry] init(_ view: MutableOrderedItemListView) { self.collectionId = view.collectionId self.items = view.items } }