-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCards.hs
50 lines (38 loc) · 1.41 KB
/
Cards.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Cards ( Suit(..),
Pip(..),
Face(..),
Card(..),
Cards,
suits,
faceCards,
pipCards,
cardDeck,
shuffle) where
import Control.Applicative
import Control.Exception
import System.Random
import Data.List
data Suit = Clubs | Diamonds | Hearts | Spades
deriving (Eq, Ord, Show, Read, Bounded, Enum)
data Pip = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
deriving (Eq, Ord, Show, Read, Bounded, Enum)
data Face = Jack | Queen | King
deriving (Eq, Ord, Show, Read, Bounded, Enum)
data Card = PipCard Suit Pip
| FaceCard Suit Face
deriving (Eq)
instance Show Card where
show (PipCard suit pip) = (show pip) ++ " of " ++ show(suit)
show (FaceCard suit face) = (show face) ++ " of " ++ show(suit)
type Cards = [Card]
suits = [(minBound :: Suit) ..]
faceCards = FaceCard <$> suits <*> [(minBound :: Face) ..]
pipCards = PipCard <$> suits <*> [(minBound :: Pip) ..]
cardDeck = faceCards ++ pipCards
shuffle :: (Eq a) => StdGen -> [a] -> [a]
shuffle _ [element] = [element]
shuffle gen elements =
let (r, newGen) = random gen :: (Int, StdGen)
element = elements !! (mod r $ length elements)
elements' = delete element elements
in element : shuffle newGen elements'