-- | -- Module : Chess.FEN -- Copyright : Miika-Petteri Matikainen 2014 -- License : GPL-2 -- -- Maintainer : miikapetteri@gmail.com -- Stability : experimental -- Portability : unknown -- -- Parsing chess games from FEN notation -- (https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation). module Chess.FEN (writeFEN, readFEN) where import Chess.Internal.Move import Chess.Internal.FEN -- | Write the current game state as FEN notation writeFEN :: GameState -> String writeFEN state = unwords [writeBoard (stateBoard state), writePlayer (currentPlayer state), writeCastlings (whiteCastlingsPossible state) (blackCastlingsPossible state), writeEnPassant (enPassantSquare state), show (halfmoveClock state), show (moveNumber state)] -- | Parse game state from FEN notation readFEN :: String -> Maybe GameState readFEN str | length parts /= 6 = Nothing | otherwise = do board' <- readBoard $ head parts player <- readPlayer $ parts !! 1 castlings <- readCastlings $ parts !! 2 enPassant <- readEnPassant $ parts !! 3 halfmoves <- readNumberWithLimit 0 $ parts !! 4 moves <- readNumberWithLimit 1 $ parts !! 5 return $ uncurry (State board' player) castlings enPassant halfmoves moves where parts = words str