import Data.List
import Control.Applicative
data Piece
= King
| Queen
| Rook
| Bishop
| Knight
| Pawn
deriving(Eq,Enum,Show) data Actor
= Black Piece
| White Piece
deriving(Eq)
newtype Board = Board [Field]
instance Show Actor
where
instance Show Board
where show (Board fields
) = all $ split fields
where
split [] = []
split fields
= let (r
,o
)=splitAt 8 fields
in r:split o
readFEN
:: [Char] -> [Field
]
fenPiece 'r' = Just Rook
fenPiece 'b' = Just Bishop
fenPiece 'n' = Just Knight
fenPiece 'q' = Just Queen
fenPiece 'k' = Just King
fenPiece 'p' = Just Pawn
fenPiece _ = Nothing
readFEN [] = []
readFEN ('/':nextrank) = readFEN nextrank
readFEN (piece:remain)
| piece `
elem`
"rbnqkp" = (White
<$> fenPiece piece
) : readFEN remain
| piece `
elem`
"RBNQKP" = (Black
<$> fenPiece
(toLower piece
)) : readFEN remain
| piece `
elem`
['1'..'8'] = (replicate
(read [piece
]) $ Nothing
) ++ readFEN remain
main = do
putStrLn.show.Board
$ readFEN
"4r3/pp4k1/7p/n1p1p1p1/NbPpP2n/1P1P1r2/P1QB4/R4RK1"
aW1wb3J0IERhdGEuTWF5YmUKaW1wb3J0IERhdGEuQ2hhcgppbXBvcnQgRGF0YS5MaXN0CmltcG9ydCBEYXRhLlN0cmluZy5VdGlscwppbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoKZGF0YSBQaWVjZSA9IEtpbmcgIHwgUXVlZW4gfCBSb29rIHwgQmlzaG9wIHwgS25pZ2h0IHwgUGF3biBkZXJpdmluZyhFcSxFbnVtLFNob3cpCmRhdGEgQWN0b3IgPSBCbGFjayBQaWVjZSB8IFdoaXRlIFBpZWNlIGRlcml2aW5nKEVxKQp0eXBlIEZpZWxkID0gTWF5YmUgQWN0b3IKCm5ld3R5cGUgQm9hcmQgPSBCb2FyZCBbRmllbGRdCgppbnN0YW5jZSBTaG93IEFjdG9yIHdoZXJlCiAgICBzaG93IChCbGFjayBwaWVjZSkgPSBmbWFwIHRvVXBwZXIgJCBzaG93IHBpZWNlCiAgICBzaG93IChXaGl0ZSBwaWVjZSkgPSBmbWFwIHRvTG93ZXIgJCBzaG93IHBpZWNlCgppbnN0YW5jZSBTaG93IEJvYXJkIHdoZXJlCiAgICBzaG93IChCb2FyZCBmaWVsZHMpID0gYWxsICQgc3BsaXQgZmllbGRzCiAgICAgICAgd2hlcmUKICAgICAgICAgICAgYWxsICAgICAgICAgID0gam9pbiAiXG4iIC4gZm1hcCByYW5rIC4gcmV2ZXJzZQogICAgICAgICAgICByYW5rICAgICAgICAgPSBqb2luICJcdCIgLiBmbWFwIChtYXliZSAiLiIgc2hvdykKICAgICAgICAgICAgc3BsaXQgW10gICAgID0gW10KICAgICAgICAgICAgc3BsaXQgZmllbGRzID0gbGV0IChyLG8pPXNwbGl0QXQgOCBmaWVsZHMgaW4gcjpzcGxpdCBvCgpmZW5QaWVjZSA6OiBDaGFyIC0+IE1heWJlIFBpZWNlCnJlYWRGRU4gOjogW0NoYXJdIC0+IFtGaWVsZF0KCmZlblBpZWNlICdyJyA9IEp1c3QgUm9vawpmZW5QaWVjZSAnYicgPSBKdXN0IEJpc2hvcApmZW5QaWVjZSAnbicgPSBKdXN0IEtuaWdodApmZW5QaWVjZSAncScgPSBKdXN0IFF1ZWVuCmZlblBpZWNlICdrJyA9IEp1c3QgS2luZwpmZW5QaWVjZSAncCcgPSBKdXN0IFBhd24KZmVuUGllY2UgXyAgID0gTm90aGluZwoKcmVhZEZFTiBbXSAgICAgICAgICAgICA9IFtdCnJlYWRGRU4gKCcvJzpuZXh0cmFuaykgPSByZWFkRkVOIG5leHRyYW5rCnJlYWRGRU4gKHBpZWNlOnJlbWFpbikKICAgIHwgcGllY2UgYGVsZW1gICJyYm5xa3AiICAgPSAoV2hpdGUgPCQ+IGZlblBpZWNlIHBpZWNlKSAgICAgICAgICAgIDogcmVhZEZFTiByZW1haW4KICAgIHwgcGllY2UgYGVsZW1gICJSQk5RS1AiICAgPSAoQmxhY2sgPCQ+IGZlblBpZWNlICh0b0xvd2VyIHBpZWNlKSkgIDogcmVhZEZFTiByZW1haW4KICAgIHwgcGllY2UgYGVsZW1gIFsnMScuLic4J10gPSAocmVwbGljYXRlIChyZWFkIFtwaWVjZV0pICQgTm90aGluZykgKysgcmVhZEZFTiByZW1haW4KICAgIHwgb3RoZXJ3aXNlID0gcmVhZEZFTiByZW1haW4KCm1haW4gPSBkbwogICBwdXRTdHJMbi5zaG93LkJvYXJkICQgcmVhZEZFTiAiNHIzL3BwNGsxLzdwL24xcDFwMXAxL05iUHBQMm4vMVAxUDFyMi9QMVFCNC9SNFJLMSIK