module Game.Deterministic.GameEngine.GameActions (
    GameActions(..)
  ) where


import           Game.Deterministic.GameEngine.GameState
import           Game.Deterministic.GameEngine.Move
import           Game.Deterministic.GameEngine.Player


data GameActions m a b = GameActions {
    getPlayer  :: GameState a -> m Player,
    -- ^ Specifies which player has the move in the state

    getMove    :: GameState a -> m (Move b),
    -- ^ Returns a legal move in the state

    getResult  :: GameState a -> Move b -> m (GameState a),
    -- ^ The transition model, which determines the result of a move

    isTerminal :: GameState a -> m Bool,
    -- ^ True if game is over, False otherwise

    getScore   :: GameState a -> Player -> m Int
    -- ^ A utility function to determine the numeric value for a game that ends in a terminal state
  }
-- ^ Set of actions that defines how the game will be played