import Foundation final class StoryTable: Table { enum Event { case updated(id: StoryId) } static func tableSpec(_ id: Int32) -> ValueBoxTable { return ValueBoxTable(id: id, keyType: .binary, compactValuesOnCreation: false) } private let sharedKey = ValueBoxKey(length: 8 + 4) private func key(_ key: StoryId) -> ValueBoxKey { self.sharedKey.setInt64(0, value: key.peerId.toInt64()) self.sharedKey.setInt32(8, value: key.id) return self.sharedKey } public func get(id: StoryId) -> CodableEntry? { if let value = self.valueBox.get(self.table, key: self.key(id)) { return CodableEntry(data: value.makeData()) } else { return nil } } public func set(id: StoryId, value: CodableEntry, events: inout [Event]) { if self.get(id: id) != value { self.valueBox.set(self.table, key: self.key(id), value: MemoryBuffer(data: value.data)) events.append(.updated(id: id)) } } override func clearMemoryCache() { } override func beforeCommit() { } }