module Simulation.Aivika.Distributed.Optimistic.Internal.Message
(Message(..),
antiMessage,
antiMessages,
LocalProcessMessage(..),
TimeServerMessage(..)) where
import GHC.Generics
import Data.Typeable
import Data.Binary
import qualified Control.Distributed.Process as DP
import Control.Distributed.Process.Serializable
data Message =
Message { messageSequenceNo :: Int,
messageSendTime :: Double,
messageReceiveTime :: Double,
messageSenderId :: DP.ProcessId,
messageReceiverId :: DP.ProcessId,
messageAntiToggle :: Bool,
messageData :: DP.Message
} deriving (Show, Typeable, Generic)
instance Binary Message
antiMessage :: Message -> Message
antiMessage x = x { messageAntiToggle = not (messageAntiToggle x) }
antiMessages :: Message -> Message -> Bool
antiMessages x y =
(messageSequenceNo x == messageSequenceNo y) &&
(messageSendTime x == messageSendTime y) &&
(messageReceiveTime x == messageReceiveTime y) &&
(messageSenderId x == messageSenderId y) &&
(messageReceiverId x == messageReceiverId y) &&
(messageAntiToggle x /= messageAntiToggle y)
instance Eq Message where
x == y =
(messageSequenceNo x == messageSequenceNo y) &&
(messageSendTime x == messageSendTime y) &&
(messageReceiveTime x == messageReceiveTime y) &&
(messageSenderId x == messageSenderId y) &&
(messageReceiverId x == messageReceiverId y) &&
(messageAntiToggle x == messageAntiToggle y)
data LocalProcessMessage = QueueMessage Message
| QueueMessageBulk [Message]
| GlobalTimeMessage (Maybe Double)
| LocalTimeMessageResp Double
| TerminateLocalProcessMessage
deriving (Eq, Show, Typeable, Generic)
instance Binary LocalProcessMessage
data TimeServerMessage = RegisterLocalProcessMessage DP.ProcessId
| UnregisterLocalProcessMessage DP.ProcessId
| GlobalTimeMessageResp DP.ProcessId Double
| LocalTimeMessage DP.ProcessId Double
| TerminateTimeServerMessage DP.ProcessId
deriving (Eq, Show, Typeable, Generic)
instance Binary TimeServerMessage