Last active
February 2, 2017 18:06
-
-
Save JSantosP/64dfb37e9eeb09c9a2d6f6b7b36e7db5 to your computer and use it in GitHub Desktop.
Some cards gist
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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