package rps fun main() { println("Hello, world") } /** * A possible move in a game of rock-paper-scissors. * * [strongAgainst] is a function for lazy evaluation because otherwise we can’t access SCISSORS before it’s been defined. * If the game needs to be expanded (e.g. the somewhat common “rock, paper, scissors, salamander, spock”), * this argument could be a List instead. */ enum class Move(val strongAgainst: () -> Move) { ROCK({ SCISSORS }), PAPER({ ROCK }), SCISSORS({ PAPER }) } // purposely not calling this Result to avoid confusion with kotlin.Result and similar enum class Outcome { WIN, DRAW, LOSS } /** Determine the [Outcome] of [first] vs [second] from the perspective of [first]. */ fun determineOutcome(first: Move, second: Move): Outcome = when { first.strongAgainst() == second -> Outcome.WIN first == second -> Outcome.DRAW else -> Outcome.LOSS }