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


enum Pip <A 2 3 4 5 6 7 8 9 10 J Q K>;
enum Suit <♦ ♣ ♥ ♠>;
 
class Card {
    has Pip $.pip;
    has Suit $.suit;
 
    method Str { $!pip ~ $!suit }
}
 
class Deck {
    has Card @.cards = pick *,
            map { Card.new(:$^pip, :$^suit) }, flat (Pip.pick(*) X Suit.pick(*));
 
    method shuffle { @!cards .= pick: * }
 
    method deal { shift @!cards }
 
    method Str  { ~@!cards }
    method gist { ~@!cards }
}
 
my Deck $d = Deck.new;
say "Deck: $d";
 
my $top = $d.deal;
say "Top card: $top";
 
$d.shuffle;
say "Deck, re-shuffled: ", $d;