{-# LANGUAGE GeneralizedNewtypeDeriving #-} module MainLoop ( MainState(..) , Main(..) , runMain ) where import Game import GLDriver import Player import Texture import Model import Control.Monad.State import Control.Monad.Trans import Data.Time import qualified Data.Map as M data MainState = MainState { run :: !Bool , driver :: !SomeDriver , time :: !UTCTime , players :: ![SomePlayer] , textures :: !(M.Map Texture TextureObject) , models :: !(M.Map Model InterleavedObj) , gameState :: !GameState } newtype Main a = Main (StateT MainState IO a) deriving (Monad, MonadState MainState, MonadIO) runMain :: MainState -> Main a -> IO (a, MainState) runMain st (Main a) = runStateT a st