Task

Create a data structure and the associated methods to define and manipulate a deck of   playing cards.

The deck should contain 52 unique cards.

The methods must include the ability to:

   make a new deck
   shuffle (randomize) the deck
   deal from the deck
   print the current contents of a deck 
Each card must have a pip value and a suit value which constitute the unique value of the card.

Related tasks:

 Card shuffles
 Deal cards_for_FreeCell
 War Card_Game
 Poker hand_analyser
 Go Fish


define Pip = <A 2 3 4 5 6 7 8 9 10 J Q K>;
define Suit = <♦ ♣ ♥ ♠>;
 
class Card(pip, suit) {
    method to_s { pip + suit }
}
 
class Deck(cards=[]) {
 
    method init {
        cards = gather {
            Pip.each { |p| Suit.each { |s| take(Card(p, s)) } }
        }
    }
 
    method shuffle {
        cards.shuffle!;
    }
 
    method deal { cards.shift };
    method to_s { cards.join(" ") };
}
 
var d = Deck();
say "Deck: #{d}";
 
var top = d.deal;
say "Top card: #{top}";
 
d.shuffle;
say "Deck, shuffled: #{d}";