module State where import Control.Concurrent import Data.IORef import Utils data Status = Serving | Retiring deriving (Eq, Show) data State = State { connectionCounter :: !Int , serverStatus :: !Status , warpThreadId :: !(Maybe ThreadId) } initialState :: State initialState = State 0 Serving Nothing type StateRef = IORef State initState :: IO (IORef State) initState = newIORef initialState getState :: IORef State -> IO State getState = readIORef retireStatus :: StateRef -> IO () retireStatus sref = strictAtomicModifyIORef sref $ \st -> st { serverStatus = Retiring , warpThreadId = Nothing } increment :: IORef State -> IO () increment sref = strictAtomicModifyIORef sref $ \st -> st { connectionCounter = connectionCounter st + 1 } decrement :: IORef State -> IO () decrement sref = strictAtomicModifyIORef sref $ \st -> st { connectionCounter = connectionCounter st - 1 } setWarpThreadId :: IORef State -> ThreadId -> IO () setWarpThreadId sref tid = strictAtomicModifyIORef sref $ \st -> st { warpThreadId = Just tid }