Skip to content

Instantly share code, notes, and snippets.

@JSantosP
Last active February 2, 2017 18:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JSantosP/64dfb37e9eeb09c9a2d6f6b7b36e7db5 to your computer and use it in GitHub Desktop.
Save JSantosP/64dfb37e9eeb09c9a2d6f6b7b36e7db5 to your computer and use it in GitHub Desktop.
Some cards gist
package scalera
package object card {
sealed trait Suit
object Suit {
lazy val values = List(Spades, Diamonds, Hearts, Clubs)
}
case object Spades extends Suit
case object Diamonds extends Suit
case object Hearts extends Suit
case object Clubs extends Suit
object CRange extends Enumeration {
type CRange = Range
val _2 = Value("2")
val _3 = Value("3")
val _4 = Value("4")
val _5 = Value("5")
val _6 = Value("6")
val _7 = Value("7")
val _8 = Value("8")
val _9 = Value("9")
val _10 = Value("10")
val J = Value("J")
val Q = Value("Q")
val K = Value("K")
val A = Value("A")
}
type Number = CRange.Value
sealed trait Card
case class SimpleCard(number: Number, suit: Suit) extends Card
case object Joker extends Card
implicit object CardOrdering extends Ordering[Card]{
def compare(c1: Card, c2: Card): Int = (c1, c2) match {
case (Joker, c2: SimpleCard) => if (c2.number == CRange.A) 0 else 1
case (c1: SimpleCard, Joker) => if (c1.number == CRange.A) 0 else -1
case (Joker, Joker) => 0
case (c1: SimpleCard, c2: SimpleCard) => c1.number.compare(c2.number)
}
}
// Nice constructors ...
object Card{
def apply(_number: Number, _suit: Suit): Card =
SimpleCard(_number, _suit)
def apply(_number: Int, _suit: Suit): Card = {
require(_number >=2 && _number <= 10, "Not a valid card number")
SimpleCard(CRange.withName(_number.toString), _suit)
}
}
}
package scalera
package object deck {
import scalera.card._
case class Deck(cards: List[Card]){
def shuffle: Deck =
Deck(scala.util.Random.shuffle(cards))
}
object Deck {
def apply(jokerAmount: Int = 0): Deck = {
val jokers = (0 to jokerAmount).map(_ => Joker).toList
val cards =
for {
suit <- Suit.values
number <- CRange.values.toList
} yield Card(number, suit)
new Deck(cards ++ jokers)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment