macbeth-lib-0.0.12: src/Macbeth/Fics/Parsers/PositionParser.hs
{-# LANGUAGE OverloadedStrings #-}
module Macbeth.Fics.Parsers.PositionParser (
parsePosition
) where
import Macbeth.Fics.Api.Api
import Control.Arrow (second)
import Data.List.Split
import Data.Maybe
parsePosition :: String -> [(Square, Piece)]
parsePosition str = fmap (second fromJust) $ filter (\(_,p) -> isJust p) squares
where rows = parseRows str
squares = concat $ fmap parseSquares rows
parseRows :: String -> [(Row, String)]
parseRows str = zip rows lines
where rows = [Eight, Seven .. One]
lines = splitOn " " str
parseColumn :: String -> [(Column, Maybe Piece)]
parseColumn line = zip [A .. H] [readPiece c | c <- line]
parseSquares :: (Row, String) -> [(Square, Maybe Piece)]
parseSquares (r, line) = fmap (\cc -> (Square (fst cc) r, snd cc)) (parseColumn line)
readPiece :: Char -> Maybe Piece
readPiece 'P' = Just(Piece Pawn White)
readPiece 'R' = Just(Piece Rook White)
readPiece 'N' = Just(Piece Knight White)
readPiece 'B' = Just(Piece Bishop White)
readPiece 'Q' = Just(Piece Queen White)
readPiece 'K' = Just(Piece King White)
readPiece 'p' = Just(Piece Pawn Black)
readPiece 'r' = Just(Piece Rook Black)
readPiece 'n' = Just(Piece Knight Black)
readPiece 'b' = Just(Piece Bishop Black)
readPiece 'q' = Just(Piece Queen Black)
readPiece 'k' = Just(Piece King Black)
readPiece _ = Nothing