{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Game ( GameState(..) , Game , runGame ) where import Level import Tank import Texture import Control.Monad import Control.Monad.State import qualified Data.Map as M data GameState = GameState { level :: !Level , tanks :: ![Tank] , textures :: !(M.Map Texture TextureObject) } deriving (Show) newtype Game a = Game (StateT GameState IO a) deriving (Monad, MonadIO, MonadState GameState) runGame :: GameState -> Game a -> IO (a, GameState) runGame st (Game a) = runStateT a st