module Piece ( Piece(..), PieceColor(..), PieceType(..), letterToPiece, loadPieces, ) where import Data.Array import Graphics.Rendering.Cairo.SVG data Piece = Piece PieceColor PieceType deriving (Eq, Ord, Ix, Bounded, Show) data PieceType = Pawn | Knight | Bishop | Rook | Queen | King deriving (Eq, Ord, Ix, Enum, Bounded, Show) data PieceColor = White | Black deriving (Eq, Ord, Ix, Enum, Bounded, Show) {- instance Enum Piece where toEnum i = Piece (toEnum (i `div` (fromEnum (maxBound :: PieceType) + 1))) (toEnum (i `mod` (fromEnum (maxBound :: PieceType) + 1))) fromEnum (Piece c t) = fromEnum c * (fromEnum (maxBound :: PieceType) + 1) + fromEnum t enumFrom p = enumFromTo p maxBound -} letterToPiece :: Char -> Piece letterToPiece 'P' = Piece White Pawn letterToPiece 'N' = Piece White Knight letterToPiece 'B' = Piece White Bishop letterToPiece 'R' = Piece White Rook letterToPiece 'Q' = Piece White Queen letterToPiece 'K' = Piece White King letterToPiece 'p' = Piece Black Pawn letterToPiece 'n' = Piece Black Knight letterToPiece 'b' = Piece Black Bishop letterToPiece 'r' = Piece Black Rook letterToPiece 'q' = Piece Black Queen letterToPiece 'k' = Piece Black King letterToPiece _ = error "wrong piece identification" piecesBase :: String piecesBase = "pieces/default/" pieceToFile :: Piece -> FilePath pieceToFile (Piece White t) = concat [piecesBase, 'w' : typeToFile t, ".svg"] pieceToFile (Piece Black t) = concat [piecesBase, 'b' : typeToFile t, ".svg"] typeToFile :: PieceType -> FilePath typeToFile Pawn = "p" typeToFile Knight = "n" typeToFile Bishop = "b" typeToFile Rook = "r" typeToFile Queen = "q" typeToFile King = "k" loadPieces :: IO (Array Piece SVG) loadPieces = do let allPieces = [ Piece c t | c <- [White ..], t <- [Pawn ..] ] allSVGs <- mapM (svgNewFromFile . pieceToFile) allPieces return $ array (minBound,maxBound) (zip allPieces allSVGs)