packages feed

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