module Parsers.Command (parseCommand) where

import           AppPrelude

import           Models.Command
import           Models.Position
import           Parsers.Position

import           Bookhound.Parser
import           Bookhound.ParserCombinators
import           Bookhound.Parsers.Number
import           Bookhound.Parsers.Text
import           Control.Newtype
import           Data.Monoid
import           Models.Piece


parseCommand :: Text -> Either [ParseError] Command
parseCommand :: Text -> Either [ParseError] Command
parseCommand = Parser Command -> Text -> Either [ParseError] Command
forall a. Parser a -> Text -> Either [ParseError] a
runParser Parser Command
command
  where

  command :: Parser Command
command =
        Text -> Parser Text
stringToken Text
"ucinewgame" Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
UciNewGame
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"uci"        Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Uci
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"isready"    Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
IsReady
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"position"   Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (PositionSpec -> Command
SetPosition (PositionSpec -> Command) -> Parser PositionSpec -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser PositionSpec
positionSpec)
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"setoption"  Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (OptionSpec -> Command
SetOption   (OptionSpec -> Command) -> Parser OptionSpec -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser OptionSpec
optionSpec)
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"move"       Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ([UnknownMove] -> Command
MakeMoves   ([UnknownMove] -> Command)
-> Parser [UnknownMove] -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser [UnknownMove]
unknownMoves)
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"ponderhit"  Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Ponderhit
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"stop"       Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Stop
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"quit"       Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Quit
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"eval"       Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Evaluate
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"display"    Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Display
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"flip"       Parser Text -> Command -> Parser Command
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Command
Flip
    Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"go" Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
         (Text -> Parser Text
stringToken Text
"perft"    Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Depth -> Command
Perft  (Depth -> Command) -> Parser Depth -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Depth
depth)
      Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"divide"   Parser Text -> Parser Command -> Parser Command
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Depth -> Command
Divide (Depth -> Command) -> Parser Depth -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Depth
depth)
      Parser Command -> Parser Command -> Parser Command
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>                           (SearchOptions -> Command
Search (SearchOptions -> Command)
-> Parser SearchOptions -> Parser Command
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser SearchOptions
searchOptions))

  searchOption :: Parser (SearchOptions -> SearchOptions)
searchOption =
        SearchOptions -> SearchOptions
setInfinite       (SearchOptions -> SearchOptions)
-> Parser Text -> Parser (SearchOptions -> SearchOptions)
forall a b. a -> Parser b -> Parser a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$  Parser Text -> Parser Text
forall {a}. Parser a -> Parser a
token (forall a. IsMatch a => [a] -> Parser a
oneOf @Text [Text
"infinite", Text
"ponder"])
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [UnknownMove] -> SearchOptions -> SearchOptions
setSearchMoves    ([UnknownMove] -> SearchOptions -> SearchOptions)
-> Parser [UnknownMove] -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"searchmoves" Parser Text -> Parser [UnknownMove] -> Parser [UnknownMove]
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser [UnknownMove]
unknownMoves)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Depth -> SearchOptions -> SearchOptions
setTargetDepth    (Depth -> SearchOptions -> SearchOptions)
-> Parser Depth -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"depth"       Parser Text -> Parser Depth -> Parser Depth
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Depth
depth)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setWhiteTime      (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"wtime"       Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setBlackTime      (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"btime"       Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setWhiteIncrement (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"winc"        Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setBlackIncrement (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"binc"        Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setMovesUntil     (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"movestogo"   Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setFindMate       (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"mate"        Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> SearchOptions -> SearchOptions
setMoveTime       (Int -> SearchOptions -> SearchOptions)
-> Parser Int -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"movetime"    Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)
    Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
-> Parser (SearchOptions -> SearchOptions)
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Word64 -> SearchOptions -> SearchOptions
setMaxNodes       (Word64 -> SearchOptions -> SearchOptions)
-> Parser Word64 -> Parser (SearchOptions -> SearchOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
stringToken Text
"nodes"       Parser Text -> Parser Word64 -> Parser Word64
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Word64
unsignedBigInt)

  positionSpec :: Parser PositionSpec
positionSpec = Position -> [UnknownMove] -> PositionSpec
PositionSpec
    (Position -> [UnknownMove] -> PositionSpec)
-> Parser Position -> Parser ([UnknownMove] -> PositionSpec)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Position
initialPositionSpec
    Parser ([UnknownMove] -> PositionSpec)
-> Parser [UnknownMove] -> Parser PositionSpec
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser Text
stringToken Text
"moves" Parser Text -> Parser [UnknownMove] -> Parser [UnknownMove]
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser [UnknownMove]
unknownMoves Parser [UnknownMove]
-> Parser [UnknownMove] -> Parser [UnknownMove]
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [UnknownMove] -> Parser [UnknownMove]
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [])

  optionSpec :: Parser OptionSpec
optionSpec = Text -> Parser Text
stringToken Text
"name" Parser Text -> Parser OptionSpec -> Parser OptionSpec
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
    (    (Text -> Parser Text
stringToken Text
"Hash"      Parser Text -> (Int -> OptionSpec) -> Parser (Int -> OptionSpec)
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int -> OptionSpec
HashSize)
     Parser (Int -> OptionSpec) -> Parser Int -> Parser OptionSpec
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser Text
stringToken Text
"value"     Parser Text -> Parser Int -> Parser Int
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int
unsignedInt)

     Parser OptionSpec -> Parser OptionSpec -> Parser OptionSpec
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Text -> Parser Text
stringToken Text
"Ponder"    Parser Text -> (Bool -> OptionSpec) -> Parser (Bool -> OptionSpec)
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool -> OptionSpec
Ponder)
     Parser (Bool -> OptionSpec) -> Parser Bool -> Parser OptionSpec
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser Text
stringToken Text
"value"     Parser Text -> Parser Bool -> Parser Bool
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Bool
boolean)

     Parser OptionSpec -> Parser OptionSpec -> Parser OptionSpec
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"Clear Hash" Parser Text -> OptionSpec -> Parser OptionSpec
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OptionSpec
ClearHash)

  searchOptions :: Parser SearchOptions
searchOptions =
    ((SearchOptions -> SearchOptions) -> SearchOptions -> SearchOptions
forall a b. (a -> b) -> a -> b
$ SearchOptions
defaultSearchOptions) ((SearchOptions -> SearchOptions) -> SearchOptions)
-> ([SearchOptions -> SearchOptions]
    -> SearchOptions -> SearchOptions)
-> [SearchOptions -> SearchOptions]
-> SearchOptions
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((SearchOptions -> SearchOptions) -> Endo SearchOptions)
-> (((SearchOptions -> SearchOptions) -> Endo SearchOptions)
    -> [SearchOptions -> SearchOptions] -> Endo SearchOptions)
-> [SearchOptions -> SearchOptions]
-> SearchOptions
-> SearchOptions
forall n o n' o' b.
(Newtype n o, Newtype n' o') =>
(o -> n) -> ((o -> n) -> b -> n') -> b -> o'
ala (SearchOptions -> SearchOptions) -> Endo SearchOptions
forall a. (a -> a) -> Endo a
Endo (Element [SearchOptions -> SearchOptions] -> Endo SearchOptions)
-> [SearchOptions -> SearchOptions] -> Endo SearchOptions
((SearchOptions -> SearchOptions) -> Endo SearchOptions)
-> [SearchOptions -> SearchOptions] -> Endo SearchOptions
forall mono m.
(MonoFoldable mono, Monoid m) =>
(Element mono -> m) -> mono -> m
foldMap ([SearchOptions -> SearchOptions] -> SearchOptions)
-> Parser [SearchOptions -> SearchOptions] -> Parser SearchOptions
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser (SearchOptions -> SearchOptions)
searchOption |*)

  initialPositionSpec :: Parser Position
initialPositionSpec =
        Text -> Parser Text
stringToken Text
"startpos" Parser Text -> Position -> Parser Position
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Position
startPosition
    Parser Position -> Parser Position -> Parser Position
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"fen"      Parser Text -> Parser Position -> Parser Position
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Position
positionFenParser

  unknownMoves :: Parser [UnknownMove]
unknownMoves = (Parser UnknownMove -> Parser UnknownMove
forall {a}. Parser a -> Parser a
token Parser UnknownMove
unknownMove |+)
  unknownMove :: Parser UnknownMove
unknownMove  = Int -> Int -> Promotion -> UnknownMove
UnknownMove
    (Int -> Int -> Promotion -> UnknownMove)
-> Parser Int -> Parser (Int -> Promotion -> UnknownMove)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Int
squareParser
    Parser (Int -> Promotion -> UnknownMove)
-> Parser Int -> Parser (Promotion -> UnknownMove)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Int
squareParser
    Parser (Promotion -> UnknownMove)
-> Parser Promotion -> Parser UnknownMove
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Promotion -> Maybe Promotion -> Promotion
forall a. a -> Maybe a -> a
fromMaybe Promotion
NoProm (Maybe Promotion -> Promotion)
-> Parser (Maybe Promotion) -> Parser Promotion
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Promotion
promotionParser |?))

  promotionParser :: Parser Promotion
promotionParser =
        Text -> Parser Text
string Text
"k" Parser Text -> Promotion -> Parser Promotion
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Promotion
KnightProm
    Parser Promotion -> Parser Promotion -> Parser Promotion
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
string Text
"b" Parser Text -> Promotion -> Parser Promotion
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Promotion
BishopProm
    Parser Promotion -> Parser Promotion -> Parser Promotion
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
string Text
"r" Parser Text -> Promotion -> Parser Promotion
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Promotion
RookProm
    Parser Promotion -> Parser Promotion -> Parser Promotion
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
string Text
"q" Parser Text -> Promotion -> Parser Promotion
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Promotion
QueenProm

  boolean :: Parser Bool
boolean      =
        Text -> Parser Text
stringToken Text
"true"  Parser Text -> Bool -> Parser Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True
    Parser Bool -> Parser Bool -> Parser Bool
forall a. Parser a -> Parser a -> Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
stringToken Text
"false" Parser Text -> Bool -> Parser Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
False

  token :: Parser a -> Parser a
token          = (forall {a}. Parser a -> Parser a) -> Parser a -> Parser a
forall a.
(forall {a}. Parser a -> Parser a) -> Parser a -> Parser a
withTransform Parser b -> Parser b
forall {a}. Parser a -> Parser a
maybeBetweenSpacing
  stringToken :: Text -> Parser Text
stringToken    = Parser Text -> Parser Text
forall {a}. Parser a -> Parser a
token (Parser Text -> Parser Text)
-> (Text -> Parser Text) -> Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Parser Text
string
  depth :: Parser Depth
depth          = Int -> Depth
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Depth) -> Parser Int -> Parser Depth
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> Bool) -> Parser Int -> Parser Int
forall a. (a -> Bool) -> Parser a -> Parser a
satisfy (Int -> Int -> Int -> Bool
inRange Int
1 Int
255) Parser Int
unsignedInt
  unsignedBigInt :: Parser Word64
unsignedBigInt = Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word64) -> Parser Int -> Parser Word64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Int
unsignedInt


  setTargetDepth :: Depth -> SearchOptions -> SearchOptions
setTargetDepth Depth
x SearchOptions
opts    = SearchOptions
opts { targetDepth        = x }
  setSearchMoves :: [UnknownMove] -> SearchOptions -> SearchOptions
setSearchMoves [UnknownMove]
x SearchOptions
opts    = SearchOptions
opts { searchMoves        = x }
  setInfinite :: SearchOptions -> SearchOptions
setInfinite SearchOptions
opts         = SearchOptions
opts { infinite           = True }
  setMoveTime :: Int -> SearchOptions -> SearchOptions
setMoveTime Int
x SearchOptions
opts       = SearchOptions
opts { moveTime           = Just x }
  setWhiteTime :: Int -> SearchOptions -> SearchOptions
setWhiteTime Int
x SearchOptions
opts      = SearchOptions
opts { whiteTime          = Just x }
  setWhiteIncrement :: Int -> SearchOptions -> SearchOptions
setWhiteIncrement Int
x SearchOptions
opts = SearchOptions
opts { whiteIncrement     = Just x }
  setBlackTime :: Int -> SearchOptions -> SearchOptions
setBlackTime Int
x SearchOptions
opts      = SearchOptions
opts { blackTime          = Just x }
  setBlackIncrement :: Int -> SearchOptions -> SearchOptions
setBlackIncrement Int
x SearchOptions
opts = SearchOptions
opts { blackIncrement     = Just x }
  setMovesUntil :: Int -> SearchOptions -> SearchOptions
setMovesUntil Int
x SearchOptions
opts     = SearchOptions
opts { movesUntilNextTime = Just x }
  setFindMate :: Int -> SearchOptions -> SearchOptions
setFindMate Int
x SearchOptions
opts       = SearchOptions
opts { findMate           = Just x }
  setMaxNodes :: Word64 -> SearchOptions -> SearchOptions
setMaxNodes Word64
x SearchOptions
opts       = SearchOptions
opts { maxNodes           = Just x }