{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE StandaloneDeriving #-}
module Raft.Event where
import Protolude
import qualified Data.Serialize as S
import Raft.Client
import Raft.RPC
import Data.Time.Clock.System
data Event v
= MessageEvent (MessageEvent v)
| TimeoutEvent SystemTime Timeout
deriving (Show)
data Timeout
= ElectionTimeout
| HeartbeatTimeout
deriving (Show)
data MessageEvent v
= RPCMessageEvent (RPCMessage v)
| ClientRequestEvent (ClientRequest v)
deriving (Show, Generic)
instance S.Serialize v => S.Serialize (MessageEvent v)