playerMove :: TicTacToe -> IO (Int, Int)
  playerMove state = do 
    mv <- getMove
    case mv of 
      Left _ -> rc
      Right oMove -> 
                  if T.isLegal state oMove && T.isBlank state oMove 
                    then return oMove
                  else rc
    where 
      rc = do
        putStrLn "Illegal move, please try again!"
        playerMove state 
playerMove :: TicTacToe -> IO (Int, Int)
playerMove state = do 
    mv <- getMove
    case mv of 
      Left _ -> rc
      Right oMove -> 
                  if T.isLegal state oMove && T.isBlank state oMove 
                    then return oMove
                  else rc
    where 
      rc = do
        putStrLn "Illegal move, please try again!"
        playerMove state 
playerMove state = do 
    mv <- getMove
    case mv of 
      Left _ -> rc
      Right oMove -> 
                  if T.isLegal state oMove && T.isBlank state oMove 
                    then return oMove
                  else rc
    where 
      rc = do
        putStrLn "Illegal move, please try again!"
        playerMove state 