hchesslib-0.1.0.0: src/Chess.hs
-- |
-- Module : Chess
-- Copyright : Miika-Petteri Matikainen 2014
-- License : GPL-2
--
-- Maintainer : miikapetteri@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- Simple chess library for implementing chess games.
module Chess (
Chess.Internal.Board.Board,
Chess.Internal.Board.Coordinates,
Chess.Internal.Board.Square(..),
Chess.Internal.Move.GameState,
Chess.Internal.Move.currentPlayer,
Chess.Internal.Piece.Color(..),
Chess.Internal.Piece.Piece(..),
Chess.Internal.Piece.PieceType(..),
board,
fullMoveNumber,
isCheckmate,
isDraw,
isLegalMove,
isStalemate,
move,
newGame,
pieceAt,
winner,
) where
import Chess.Internal.Board
import Chess.Internal.Move
import Chess.Internal.Piece
import qualified Chess.Internal.Game as G
import qualified Chess.Internal.Notation as N
-- | Has the game ended in checkmate
isCheckmate :: GameState -> Bool
isCheckmate = G.isCheckmate
-- | Has the game ended in stalemate
isStalemate :: GameState -> Bool
isStalemate = G.isStalemate
-- | Is the game draw? I.e. is the game stalemate or is the game draw by
-- insufficient material.
isDraw :: GameState -> Bool
isDraw = G.isDraw
-- | Returns the winner of the game if any
winner :: GameState -> Maybe Color
winner = G.getWinner
-- | Is the given move legal. The only supported move format at the moment
-- is coordinate notation.
isLegalMove :: GameState
-> String -- ^ Move in coordinate notation. E.g. "e2-e4" or "b1-c3"
-> Bool
isLegalMove game moveStr = case N.parseMove game moveStr of
Just m -> m `elem` generateAllMoves game
Nothing -> False
-- | Make a move. The only supported move format at the moment is coordinate
-- notation.
move :: GameState
-> String -- ^ Move in coordinate notation. E.g. "e2-e4" or "b1-c3"
-> Maybe GameState
move game moveStr = do m <- N.parseMove game moveStr
case G.applyMove game m of
Left _ -> Nothing
Right game' -> Just game'
-- | Current board state in the game
board :: GameState -> Board
board = stateBoard
-- | Get initial game state
newGame :: GameState
newGame = initialState
-- | Get the piece at the given coordinate
pieceAt :: Board
-> String -- ^ Square coordinate. E.g. "e4"
-> Maybe Piece
pieceAt b coordinateStr = do coords <- parseCoordinate coordinateStr
getPiece b coords
-- | Full move number. Incremented after black's move.
fullMoveNumber :: GameState -> Integer
fullMoveNumber = moveNumber