Swiftgram/TelegramUI/ChatHistoryEntry.swift
2016-08-23 16:21:34 +03:00

75 lines
2.2 KiB
Swift

import Postbox
import TelegramCore
enum ChatHistoryEntry: Identifiable, Comparable {
case HoleEntry(MessageHistoryHole)
case MessageEntry(Message)
case UnreadEntry(MessageIndex)
var stableId: UInt64 {
switch self {
case let .HoleEntry(hole):
return UInt64(hole.stableId) | ((UInt64(1) << 40))
case let .MessageEntry(message):
return UInt64(message.stableId) | ((UInt64(2) << 40))
case .UnreadEntry:
return UInt64(3) << 40
}
}
var index: MessageIndex {
switch self {
case let .HoleEntry(hole):
return hole.maxIndex
case let .MessageEntry(message):
return MessageIndex(message)
case let .UnreadEntry(index):
return index
}
}
}
func ==(lhs: ChatHistoryEntry, rhs: ChatHistoryEntry) -> Bool {
switch lhs {
case let .HoleEntry(lhsHole):
switch rhs {
case let .HoleEntry(rhsHole) where lhsHole == rhsHole:
return true
default:
return false
}
case let .MessageEntry(lhsMessage):
switch rhs {
case let .MessageEntry(rhsMessage) where MessageIndex(lhsMessage) == MessageIndex(rhsMessage) && lhsMessage.flags == rhsMessage.flags:
if lhsMessage.media.count != rhsMessage.media.count {
return false
}
for i in 0 ..< lhsMessage.media.count {
if !lhsMessage.media[i].isEqual(rhsMessage.media[i]) {
return false
}
}
return true
default:
return false
}
case let .UnreadEntry(lhsIndex):
switch rhs {
case let .UnreadEntry(rhsIndex) where lhsIndex == rhsIndex:
return true
default:
return false
}
}
}
func <(lhs: ChatHistoryEntry, rhs: ChatHistoryEntry) -> Bool {
let lhsIndex = lhs.index
let rhsIndex = rhs.index
if lhsIndex == rhsIndex {
return lhs.stableId < rhs.stableId
} else {
return lhsIndex < rhsIndex
}
}