diff options
author | Frederick Yin <fkfd@fkfd.me> | 2023-01-04 20:40:46 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@fkfd.me> | 2023-01-04 20:40:46 +0800 |
commit | 6a8ff0ff2a09e7fe896d5fff3dda047bef6d1ced (patch) | |
tree | ed62b3df0975dad1e99b75c6129804427194d434 /Card.hs |
Full decks and shuffling
Diffstat (limited to 'Card.hs')
-rw-r--r-- | Card.hs | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -0,0 +1,27 @@ +module Card where + +import System.Random (RandomGen, random) + +data Suit = Spade | Heart | Diamond | Club deriving (Show, Eq, Ord, Enum) +data Rank = Two | Three | Four | Five | Six | Seven | Eight + | Nine | Ten | Jack | Queen | King | Ace + deriving (Show, Eq, Ord, Enum) +data Card = Card { suit :: Suit, rank :: Rank } deriving (Show, Eq, Ord) + +-- | Produce one full 52-deck. +fullDeck = [Card st rk | st <- allSuits, rk <- allRanks] + where allSuits = enumFrom $ toEnum 0 + allRanks = enumFrom $ toEnum 0 + +-- | Produce n full 52-decks. +fullDecks :: Int -> [Card] +fullDecks n = concat $ replicate n fullDeck + +-- | Shuffle a list. Works by taking a random entry each time. +shuffle :: (RandomGen g) => g -> [a] -> [a] +shuffle _ [] = [] +shuffle _ [x] = [x] +shuffle gen xs = (head right):(shuffle newGen (left ++ (tail right))) + where (rand, newGen) = random gen + i = rand `mod` (length xs) + (left, right) = splitAt i xs |