{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
module Raft.Persistent where
import Protolude
import qualified Data.Serialize as S
import Raft.Types
class Monad m => RaftPersist m where
type RaftPersistError m
initializePersistentState
:: Exception (RaftPersistError m)
=> m (Either (RaftPersistError m) ())
readPersistentState
:: Exception (RaftPersistError m)
=> m (Either (RaftPersistError m) PersistentState)
writePersistentState
:: Exception (RaftPersistError m)
=> PersistentState -> m (Either (RaftPersistError m) ())
data PersistentState = PersistentState
{ currentTerm :: !Term
, votedFor :: !(Maybe NodeId)
} deriving (Show, Eq, Generic, S.Serialize)
initPersistentState :: PersistentState
initPersistentState = PersistentState
{ currentTerm = term0
, votedFor = Nothing
}