summaryrefslogtreecommitdiff
path: root/Card.hs
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-04 20:40:46 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-04 20:40:46 +0800
commit6a8ff0ff2a09e7fe896d5fff3dda047bef6d1ced (patch)
treeed62b3df0975dad1e99b75c6129804427194d434 /Card.hs
Full decks and shuffling
Diffstat (limited to 'Card.hs')
-rw-r--r--Card.hs27
1 files changed, 27 insertions, 0 deletions
diff --git a/Card.hs b/Card.hs
new file mode 100644
index 0000000..c0a13a8
--- /dev/null
+++ b/Card.hs
@@ -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