{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Game ( GameState(..) , Game , runGame ) where import Level import Tank import Control.Monad import Control.Monad.State data GameState = GameState { level :: !Level , tanks :: ![Tank] } 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