From fec602aca74e889984a62a9d202213429a31f6b9 Mon Sep 17 00:00:00 2001 From: LQ63 Date: Wed, 8 Apr 2026 08:07:20 +0200 Subject: [PATCH] feat(io): FastParse FEN Added Shared Parser support --- .../de/nowchess/io/fen/FenParserSupport.scala | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala diff --git a/modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala b/modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala new file mode 100644 index 0000000..ea33502 --- /dev/null +++ b/modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala @@ -0,0 +1,32 @@ +package de.nowchess.io.fen + +import de.nowchess.api.board.* + +private[fen] object FenParserSupport: + + sealed trait RankToken + case class PieceToken(piece: Piece) extends RankToken + case class EmptyToken(count: Int) extends RankToken + + val charToPieceType: Map[Char, PieceType] = Map( + 'p' -> PieceType.Pawn, + 'r' -> PieceType.Rook, + 'n' -> PieceType.Knight, + 'b' -> PieceType.Bishop, + 'q' -> PieceType.Queen, + 'k' -> PieceType.King + ) + + def buildSquares(rank: Rank, tokens: Seq[RankToken]): Option[List[(Square, Piece)]] = + tokens.foldLeft(Option((List.empty[(Square, Piece)], 0))): + case (None, _) => None + case (Some((acc, fileIdx)), PieceToken(piece)) => + if fileIdx > 7 then None + else + val sq = Square(File.values(fileIdx), rank) + Some((acc :+ (sq -> piece), fileIdx + 1)) + case (Some((acc, fileIdx)), EmptyToken(n)) => + val next = fileIdx + n + if next > 8 then None + else Some((acc, next)) + .flatMap { case (squares, total) => if total == 8 then Some(squares) else None }