module Tak.Tree (
GameBranch(..),
GameNode(..),
Eval,
gameTree,
treeGameState
) where
import Control.Monad.ST
import Tak.ApplyPlay
import Tak.PossiblePlays
import Tak.Types
data GameBranch a = GameBranch Play (GameNode a)
data GameNode a = GameNode GameState a [GameBranch a]
type Eval a = GameState -> a
gameTree :: GameState -> Eval a -> GameNode a
gameTree gameState eval = runST $ do
return $ gameTreeST gameState eval
gameTreeST
:: GameState
-> Eval a
-> (GameNode a)
gameTreeST gameState eval =
GameNode gameState (eval gameState) branches where
branches = map branch plays
branch p =
let newGameState = noErr $ play p gameState in
GameBranch p (gameTreeST newGameState eval)
noErr (Left state) = state
noErr (Right err) = error $ "Error creating game tree: " ++ show err
plays = possiblePlays gameState
treeGameState :: GameNode a -> GameState
treeGameState (GameNode state _ _) = state