packages feed

turncoat-1.0: src/Models/Command.hs

module Models.Command where

import           AppPrelude

import           Models.Piece
import           Models.Position
import           Models.Score
import           Utils.Board

import           Data.Word


data Command
  = Uci
  | UciNewGame
  | IsReady
  | Search SearchOptions
  | SetPosition PositionSpec
  | SetOption OptionSpec
  | Ponderhit
  | Stop
  | Quit
  | MakeMoves [UnknownMove]
  | Perft Depth
  | Divide Depth
  | Evaluate
  | Display
  | Flip


data EngineInfo = EngineInfo
  { name    :: Text
  , version :: Text
  , author  :: Text
  }

data EngineOptions = EngineOptions
  { hashSize :: Word16
  , ponder   :: Bool
  }

data EngineOption = SpinOption
  { deflt :: Word16
  , lo    :: Word16
  , hi    :: Word16
  }
  | CheckOption Bool
  | ButtonOption


data OptionSpec
  = HashSize Int
  | Ponder Bool
  | ClearHash

data SearchOptions = SearchOptions
  { searchMoves        :: [UnknownMove]
  , infinite           :: Bool
  , targetDepth        :: Depth
  , moveTime           :: Maybe Int
  , whiteTime          :: Maybe Int
  , whiteIncrement     :: Maybe Int
  , blackTime          :: Maybe Int
  , blackIncrement     :: Maybe Int
  , movesUntilNextTime :: Maybe Int
  , findMate           :: Maybe Int
  , maxNodes           :: Maybe Word64
  }


data PositionSpec = PositionSpec
  { initialPosition :: Position,
    moves           :: [UnknownMove]
  }


data UnknownMove = UnknownMove
  { start     :: Square,
    end       :: Square,
    promotion :: Promotion
  }


engineInfo :: EngineInfo
engineInfo = EngineInfo
  { name    = "Turncoat"
  , version = "1.0"
  , author  = "Alberto Perez"
  }


defaultEngineOptions :: EngineOptions
defaultEngineOptions = EngineOptions
  { hashSize = 16
  , ponder   = False
  }


defaultSearchOptions :: SearchOptions
defaultSearchOptions = SearchOptions
  { searchMoves        = []
  , infinite           = False
  , targetDepth        = maxBound
  , findMate           = Nothing
  , whiteTime          = Nothing
  , whiteIncrement     = Nothing
  , blackTime          = Nothing
  , blackIncrement     = Nothing
  , movesUntilNextTime = Nothing
  , maxNodes           = Nothing
  , moveTime           = Nothing
  }


instance Show EngineOption where
  show = \case
    SpinOption {..}    -> "type spin" <> " default " <> show deflt
                        <> " min " <> show lo <> " max " <> show hi
    CheckOption deflt -> "type check" <> " default " <> toLower (show deflt)
    ButtonOption      -> "type button"


type Task = Async ()