#* http://rosettacode.org/wiki/Playing_Cards
  Simulate a deck of cards
*#

card = object.new

card.init = { pip, suit |
  my.pip = pip
  my.suit = suit
}

card.suits = [ :Clubs :Hearts :Spades :Diamonds ]
card.pips = 2.to(10) + [ :Jack :Queen :King :Ace ]

card.prototype.to_s = {
  "#{my.pip} of #{my.suit}"
}

#Allows for sorting
card.prototype.<=> = { rhs |
  suit_cmp = card.suits.index_of(my.suit) <=> card.suits.index_of(rhs.suit)
  true? suit_cmp == 0
    { card.pips.index_of(my.pip) <=> card.pips.index_of(rhs.pip) }
    { suit_cmp }
}

deck = object.new

deck.init = {
  cards = []
  card.suits.each { suit |
    card.pips.each { pip |
      cards << card.new pip, suit
    }
  }

  my.cards = cards
}

deck.prototype [
  shuffle: 
  {
    my.cards.shuffle!
    my
  }

  deal: { num |
    my.cards.pop num
  }

  to_s: {
    my.cards.to_s
  }
]

d = deck.new.shuffle
p "Number of cards in deck: #{d.cards.length}"
p "Hand of five cards: #{d.deal(5).sort}"
p "Number of cards remaining: #{d.cards.length}"