module Numeric.Probability.Game.PlayingCards (PlayingCard(..),Suit(..),Rank(..),AceLowRank(..),deck,
sameSuit, sameRank) where
import Data.Function (on)
import Numeric.Probability.Game.Cards
data Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack
| Queen | King | Ace
deriving (Bounded, Enum, Eq, Ord, Show, Read)
newtype AceLowRank = AceLow {alRank :: Rank}
deriving (Eq, Show, Read)
instance Bounded AceLowRank where
minBound = AceLow Ace
maxBound = AceLow King
instance Enum AceLowRank where
fromEnum (AceLow Ace) = 0
fromEnum (AceLow x) = fromEnum x + 1
toEnum 0 = AceLow Ace
toEnum n = AceLow $ toEnum (n 1)
instance Ord AceLowRank where
compare = compare `on` fromEnum
data Suit = Clubs | Diamonds | Hearts | Spades
deriving (Eq, Ord, Show, Read)
data PlayingCard = PlayingCard {rank :: Rank, suit :: Suit}
deriving (Eq, Ord, Show, Read)
deck :: Cards PlayingCard
deck = makeCards [PlayingCard r s | r <- [minBound .. maxBound], s <- [Clubs,Diamonds,Hearts,Spades]]
sameSuit :: PlayingCard -> PlayingCard -> Bool
sameSuit = (==) `on` suit
sameRank :: PlayingCard -> PlayingCard -> Bool
sameRank = (==) `on` rank