import Foundation public struct GlobalMessageIdsNamespace: Hashable { public let peerIdNamespace: PeerId.Namespace public let messageIdNamespace: MessageId.Namespace public init(peerIdNamespace: PeerId.Namespace, messageIdNamespace: MessageId.Namespace) { self.peerIdNamespace = peerIdNamespace self.messageIdNamespace = messageIdNamespace } } public struct ChatListMessageTagSummaryResultComponent { public let tag: MessageTags public let namespace: MessageId.Namespace public init(tag: MessageTags, namespace: MessageId.Namespace) { self.tag = tag self.namespace = namespace } } public struct ChatListMessageTagActionsSummaryResultComponent { public let type: PendingMessageActionType public let namespace: MessageId.Namespace public init(type: PendingMessageActionType, namespace: MessageId.Namespace) { self.type = type self.namespace = namespace } } public struct ChatListMessageTagSummaryResultCalculation { public let addCount: ChatListMessageTagSummaryResultComponent public let subtractCount: ChatListMessageTagActionsSummaryResultComponent public init(addCount: ChatListMessageTagSummaryResultComponent, subtractCount: ChatListMessageTagActionsSummaryResultComponent) { self.addCount = addCount self.subtractCount = subtractCount } } func resolveChatListMessageTagSummaryResultCalculation(addSummary: MessageHistoryTagNamespaceSummary?, subtractSummary: Int32?) -> Bool? { let count = (addSummary?.count ?? 0) - (subtractSummary ?? 0) return count > 0 } func resolveChatListMessageTagSummaryResultCalculation(postbox: Postbox, peerId: PeerId, calculation: ChatListMessageTagSummaryResultCalculation?) -> Bool? { guard let calculation = calculation else { return nil } let addSummary = postbox.messageHistoryTagsSummaryTable.get(MessageHistoryTagsSummaryKey(tag: calculation.addCount.tag, peerId: peerId, namespace: calculation.addCount.namespace)) let subtractSummary = postbox.pendingMessageActionsMetadataTable.getCount(.peerNamespaceAction(peerId, calculation.subtractCount.namespace, calculation.subtractCount.type)) let count = (addSummary?.count ?? 0) - subtractSummary return count > 0 } public final class SeedConfiguration { public let globalMessageIdsPeerIdNamespaces: Set public let initializeChatListWithHole: (topLevel: ChatListHole?, groups: ChatListHole?) public let messageHoles: [PeerId.Namespace: [MessageId.Namespace: Set]] public let upgradedMessageHoles: [PeerId.Namespace: [MessageId.Namespace: Set]] public let messageThreadHoles: [PeerId.Namespace: [MessageId.Namespace]] public let messageTagsWithSummary: MessageTags public let existingGlobalMessageTags: GlobalMessageTags public let peerNamespacesRequiringMessageTextIndex: [PeerId.Namespace] public let peerSummaryCounterTags: (Peer, Bool) -> PeerSummaryCounterTags public let additionalChatListIndexNamespace: MessageId.Namespace? public let messageNamespacesRequiringGroupStatsValidation: Set public let defaultMessageNamespaceReadStates: [MessageId.Namespace: PeerReadState] public let chatMessagesNamespaces: Set public let globalNotificationSettingsPreferencesKey: ValueBoxKey public let defaultGlobalNotificationSettings: PostboxGlobalNotificationSettings public init(globalMessageIdsPeerIdNamespaces: Set, initializeChatListWithHole: (topLevel: ChatListHole?, groups: ChatListHole?), messageHoles: [PeerId.Namespace: [MessageId.Namespace: Set]], upgradedMessageHoles: [PeerId.Namespace: [MessageId.Namespace: Set]], messageThreadHoles: [PeerId.Namespace: [MessageId.Namespace]], existingMessageTags: MessageTags, messageTagsWithSummary: MessageTags, existingGlobalMessageTags: GlobalMessageTags, peerNamespacesRequiringMessageTextIndex: [PeerId.Namespace], peerSummaryCounterTags: @escaping (Peer, Bool) -> PeerSummaryCounterTags, additionalChatListIndexNamespace: MessageId.Namespace?, messageNamespacesRequiringGroupStatsValidation: Set, defaultMessageNamespaceReadStates: [MessageId.Namespace: PeerReadState], chatMessagesNamespaces: Set, globalNotificationSettingsPreferencesKey: ValueBoxKey, defaultGlobalNotificationSettings: PostboxGlobalNotificationSettings) { self.globalMessageIdsPeerIdNamespaces = globalMessageIdsPeerIdNamespaces self.initializeChatListWithHole = initializeChatListWithHole self.messageHoles = messageHoles self.upgradedMessageHoles = upgradedMessageHoles self.messageThreadHoles = messageThreadHoles self.messageTagsWithSummary = messageTagsWithSummary self.existingGlobalMessageTags = existingGlobalMessageTags self.peerNamespacesRequiringMessageTextIndex = peerNamespacesRequiringMessageTextIndex self.peerSummaryCounterTags = peerSummaryCounterTags self.additionalChatListIndexNamespace = additionalChatListIndexNamespace self.messageNamespacesRequiringGroupStatsValidation = messageNamespacesRequiringGroupStatsValidation self.defaultMessageNamespaceReadStates = defaultMessageNamespaceReadStates self.chatMessagesNamespaces = chatMessagesNamespaces self.globalNotificationSettingsPreferencesKey = globalNotificationSettingsPreferencesKey self.defaultGlobalNotificationSettings = defaultGlobalNotificationSettings } }