module CardDeck ( Card , CardStatus(..) , Stack , generateDeck , generateShuffledDeck , showCard , hideCard , flipCard ) where import Shuffle -- Colors of cards data CardType = Clubs | Diamonds | Hearts | Spades | NoneType deriving (Show, Enum, Eq) -- Values of cards data CardValue = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | NoneValue deriving (Show, Enum, Eq) data CardStatus = Hidden | Visible deriving (Show) -- A card has a type and a value and is either shown or hidden. type Card = (CardType, CardValue, CardStatus) -- A stack of cards type Stack = [Card] -- Generate a standard 52-card deck, given by CardValue and CardType generateDeck :: Stack generateDeck = [(cType, cValue, Hidden) | cType <- types, cValue <- values] where types = init $ enumFrom Clubs values = init $ enumFrom Ace generateShuffledDeck :: Stack generateShuffledDeck = shuffle generateDeck showCard :: Card -> Card showCard (t, v, _) = (t,v,Visible) hideCard :: Card -> Card hideCard (t, v, _) = (t,v,Hidden) flipCard :: Card -> Card flipCard c@(_, _, Visible) = hideCard c flipCard c@(_, _, Hidden) = showCard c