{-# LANGUAGE GeneralizedNewtypeDeriving #-} module MainLoop ( MainState(..) , MainT(..) , Main , runMain ) where import Game import GLDriver import Player import Texture 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) } newtype MainT m a = MainT (StateT MainState m a) deriving (Monad, MonadState MainState, MonadIO, MonadTrans) type Main = MainT Game runMain :: MainState -> Main a -> Game (a, MainState) runMain st (MainT a) = runStateT a st