import Foundation public struct StoryExpirationTimeEntry: Equatable { public var id: StoryId public var expirationTimestamp: Int32 init(id: StoryId, expirationTimestamp: Int32) { self.id = id self.expirationTimestamp = expirationTimestamp } } final class MutableStoryExpirationTimeItemsView: MutablePostboxView { var topEntry: StoryExpirationTimeEntry? init(postbox: PostboxImpl) { let _ = self.refreshDueToExternalTransaction(postbox: postbox) } func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool { var updated = false if !transaction.storyItemsEvents.isEmpty { var refresh = false loop: for event in transaction.storyItemsEvents { switch event { case .replace: refresh = true break loop } } if refresh { updated = self.refreshDueToExternalTransaction(postbox: postbox) } } return updated } func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool { var topEntry: StoryExpirationTimeEntry? if let item = postbox.storyItemsTable.getMinExpirationTimestamp() { topEntry = StoryExpirationTimeEntry(id: item.0, expirationTimestamp: item.1) } if self.topEntry != topEntry { self.topEntry = topEntry return true } else { return false } } func immutableView() -> PostboxView { return StoryExpirationTimeItemsView(self) } } public final class StoryExpirationTimeItemsView: PostboxView { public let topEntry: StoryExpirationTimeEntry? init(_ view: MutableStoryExpirationTimeItemsView) { self.topEntry = view.topEntry } }