module Engine ( crafty, gnuchess, engineStart, engineStop, engineSendCmd ) where import System.Exit import System.IO import System.Process data Engine = Engine Name FilePath data EngineHandle = EngineHandle Handle Handle ProcessHandle type Name = String crafty :: Engine crafty = Engine "Crafty" "/usr/local/bin/crafty" gnuchess :: Engine gnuchess = Engine "GNUChess" "/usr/local/bin/gnuchess" engineStart :: Engine -> IO EngineHandle engineStart (Engine name path) = do putStrLn $ "Starting engine \"" ++ name ++ "\"" (inp,outp,_,pid) <- runInteractiveProcess path [] Nothing Nothing hSetBuffering inp LineBuffering hSetBuffering outp LineBuffering return (EngineHandle inp outp pid) engineStop :: EngineHandle -> IO ExitCode engineStop (EngineHandle _ _ pid) = do terminateProcess pid waitForProcess pid -- Send a command to a chess engine. engineSendCmd :: EngineHandle -> String -> IO () engineSendCmd (EngineHandle inp _ _) cmd = hPutStrLn inp cmd