chessIO-0.6.0.0: src/Game/Chess/Internal/Square.hs
module Game.Chess.Internal.Square (
IsSquare(..), Sq(..), isDark, isLight, toCoord
) where
import Data.Bits (Bits(testBit))
import Data.Char (chr, ord)
import Data.Ix (Ix)
import Data.String (IsString(fromString))
import Data.Word
class IsSquare sq where
toIndex :: sq -> Int
toRF :: sq -> (Int, Int)
toRF sq = toIndex sq `divMod` 8
instance IsSquare Int where
toIndex = id
instance IsSquare (Int, Int) where
toIndex (r, f) = r*8 + f
toRF = id
data Sq = A1 | B1 | C1 | D1 | E1 | F1 | G1 | H1
| A2 | B2 | C2 | D2 | E2 | F2 | G2 | H2
| A3 | B3 | C3 | D3 | E3 | F3 | G3 | H3
| A4 | B4 | C4 | D4 | E4 | F4 | G4 | H4
| A5 | B5 | C5 | D5 | E5 | F5 | G5 | H5
| A6 | B6 | C6 | D6 | E6 | F6 | G6 | H6
| A7 | B7 | C7 | D7 | E7 | F7 | G7 | H7
| A8 | B8 | C8 | D8 | E8 | F8 | G8 | H8
deriving (Bounded, Enum, Eq, Ix, Ord, Show, Read)
instance IsSquare Sq where
toIndex = fromEnum
toCoord :: (IsSquare sq, IsString s) => sq -> s
toCoord (toRF -> (r,f)) = fromString [chr (f + ord 'a'), chr (r + ord '1')]
isDark :: IsSquare sq => sq -> Bool
isDark sq = (0xaa55aa55aa55aa55 :: Word64) `testBit` toIndex sq
isLight :: IsSquare sq => sq -> Bool
isLight = not . isDark