import Random
import Control.Monad
import Data.List
import Control.Monad.Identity
data RPS = Rock | Paper | Scissors deriving (Enum, Show, Read, Eq)
instance Ord RPS where
compare a b | a == b = EQ
compare Rock Scissors = GT
compare Paper Rock = GT
compare Scissors Paper = GT
compare _ _ = LT
randomMove :: Rand RPS
randomMove = toEnum <$> (randomR (0,2))
aiMove :: IO RPS
aiMove = runRand randomMove
playerMove :: IO RPS
playerMove = read <$> getLine
gameRound :: IO Ordering
gameRound = do
ai <- aiMove
putStr ">"
player <- playerMove
putStrLn $ "ai's move -> "++ show ai
case player `compare` ai of
EQ -> putStrLn "Draw" >> gameRound
GT -> putStrLn "Player wins round!" >> return GT
LT -> putStrLn "Ai wins round!" >> return LT
numRounds = 3
main :: IO ()
main = do
putStrLn "Input moves as one of: Rock Paper Scissors"
rounds <- sequence $ replicate numRounds gameRound
let (plWins, aiWins) = partition (==GT) rounds
putStrLn $ case (length plWins) `compare` (length aiWins) of
EQ -> "The game is a draw!"
GT -> "The player wins!"
LT -> "The computer wins!"