1 module Problem(readProblem) where
    2 
    3 import Char(isUpper,toLower)
    4 import Board
    5 
    6 readProblem :: String -> (Board, (Colour, Int))
    7 readProblem = parseProblem . lines
    8 
    9 comment s = (s == [] || take 2 s == "--")
   10 
   11 parseProblem :: [String] -> (Board, (Colour, Int))
   12 parseProblem s = (bd, gl)
   13         where
   14         bd = parseBoard bdtxt
   15         gl = parseGoal gltxt 
   16         (bdtxt, gltxt) = splitAt 8 (filter (not . comment) s)
   17 
   18 parseBoard :: [String] -> Board
   19 parseBoard = convert . concat . zipWith parseRank (reverse [1..8])
   20         where
   21         convert = foldr addPiece emptyBoard
   22         addPiece (p,sq) = putPieceAt sq p
   23 
   24 parseRank r = concat . zipWith (parseSquare r) [1..8] . filter (/= ' ')
   25 
   26 parseSquare r f '-' = []
   27 parseSquare r f  c  = 
   28         [((clr,kin), (f,r))]
   29         where
   30         clr = if isUpper c then Black else White 
   31         kin = case toLower c of
   32               'k' -> King 
   33               'q' -> Queen
   34               'r' -> Rook
   35               'b' -> Bishop
   36               'n' -> Knight
   37               'p' -> Pawn
   38 
   39 parseGoal :: [String] -> (Colour, Int)
   40 parseGoal [gltxt] = (c, n)
   41         where
   42         ws = words gltxt
   43         c  = read (head ws)
   44         n  = read (last ws)