| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
Game.Poker.Hands
- data Hand
- toHand :: [Card] -> Maybe Hand
- fromHand :: Hand -> [Card]
- pokerHand :: Hand -> (PokerHand, Card)
- data PokerHand
- straightHint :: Hand -> Maybe Card
- flushHint :: Hand -> Maybe Card
- nOfKindHint :: Int -> Hand -> Maybe [[Card]]
- fourOfAKind :: Hand -> Maybe (PokerHand, Card)
- fullHouse :: Hand -> Maybe (PokerHand, Card)
- flush :: Hand -> Maybe (PokerHand, Card)
- straight :: Hand -> Maybe (PokerHand, Card)
- threeOfAKind :: Hand -> Maybe (PokerHand, Card)
- twoPair :: Hand -> Maybe (PokerHand, Card)
- onePair :: Hand -> Maybe (PokerHand, Card)
- type DiscardList = [Card]
- type Deck = [Card]
- drawHand :: Deck -> DiscardList -> Hand -> Maybe (Hand, Deck)
- getHand :: Deck -> Maybe (Hand, Deck)
- getDiscardList :: Hand -> IO (Maybe DiscardList)
- toIntList :: String -> Maybe [Int]
- selectByIndexes :: [a] -> [Int] -> Maybe [a]
- straightFlush :: Hand -> Maybe (PokerHand, Card)
- judgeVictory :: (PokerHand, Card) -> (PokerHand, Card) -> Ordering
Documentation
Constrained cards in hand
>>>:type fromHandfromHand :: Hand -> [Card]
toHand :: [Card] -> Maybe Hand Source
Cards to Hard
>>>toHand allCardsNothing
>>>fmap (length . fromHand) (toHand $ take 5 allCards)Just 5
pokerHand :: Hand -> (PokerHand, Card) Source
Detect poker hand and return strength Card
>>>let sameNum = filter ((==14) . cardNumber) allCards>>>let sameSuit = filter ((==Hearts) . cardSuit) allCards
>>>pokerHand (Hand $ take 5 sameSuit)(StraightFlush,H6_)
>>>let buta = take 2 allCards ++ (take 2 $ drop 17 allCards) ++ [last allCards]>>>pokerHand (Hand buta)(HighCards,SA_)
straightHint :: Hand -> Maybe Card Source
Check straight in Hand
>>>straightHint $ Hand (take 5 allCards)Just H6_
>>>straightHint $ Hand (take 5 $ drop 8 allCards)Just HA_
>>>straightHint $ Hand (take 2 $ allCards)Nothing
flushHint :: Hand -> Maybe Card Source
Check flush in Hand
>>>flushHint $ Hand (take 5 $ filter (\x -> cardSuit x == Hearts) allCards )Just H6_
>>>flushHint $ Hand (take 5 $ filter (\x -> cardNumber x == 2) allCards )Nothing
nOfKindHint :: Int -> Hand -> Maybe [[Card]] Source
n of Kind in Hand
>>>let treeCards = take 3 $ filter ((==2) . cardNumber) $ allCards>>>let twoCards = take 2 $ filter ((==10) . cardNumber) $ allCards>>>let fullhouse = toHand $ treeCards ++ twoCards
>>>fullhouse >>= nOfKindHint 2Just [[H10,D10]]
>>>fullhouse >>= nOfKindHint 3Just [[H2_,D2_,C2_]]
>>>fullhouse >>= nOfKindHint 4Nothing
fourOfAKind :: Hand -> Maybe (PokerHand, Card) Source
Detect FourOfAKind and return strongest Card
>>>let sameNum = filter ((==4) . cardNumber) allCards>>>let sameSuit = filter ((==Spades) . cardSuit) allCards>>>fourOfAKind $ Hand (take 4 sameNum ++ take 1 sameSuit)Just (FourOfAKind,S4_)
>>>fourOfAKind $ Hand (take 5 sameSuit)Nothing
fullHouse :: Hand -> Maybe (PokerHand, Card) Source
Detect fullHouse and return strongest Card
>>>let sameNum = filter ((==9) . cardNumber) allCards>>>let sameNum' = filter ((==10) . cardNumber) allCards>>>let sameSuit = filter ((==Spades) . cardSuit) allCards>>>fullHouse $ Hand (take 2 sameNum ++ take 3 sameNum')Just (FullHouse,C10)
>>>fullHouse $ Hand (take 3 sameNum ++ take 2 sameNum')Just (FullHouse,C9_)
>>>fullHouse $ Hand (take 2 sameNum ++ take 3 sameSuit)Nothing
>>>fullHouse $ Hand (take 5 sameSuit)Nothing
flush :: Hand -> Maybe (PokerHand, Card) Source
Detect Flush and return strongest Card
>>>flush $ Hand (take 5 $ filter ((==Hearts) . cardSuit ) allCards)Just (Flush,H6_)
>>>flush $ Hand (take 5 $ filter ((<= 3) . cardNumber) allCards)Nothing
straight :: Hand -> Maybe (PokerHand, Card) Source
Detect Straight and return strongest Card
>>>straight $ Hand (take 5 $ filter ((==Hearts) . cardSuit) allCards)Just (Straight,H6_)
>>>straight $ Hand (take 5 $ filter (even . cardNumber) allCards)Nothing
threeOfAKind :: Hand -> Maybe (PokerHand, Card) Source
Detect ThreeOfAKind and return strongest Card
>>>let sameNum = filter ((==4) . cardNumber) allCards>>>let sameSuit = filter ((==Spades) . cardSuit) allCards>>>threeOfAKind $ Hand (take 3 sameNum ++ take 2 sameSuit)Just (ThreeOfAKind,C4_)
>>>threeOfAKind $ Hand (take 5 sameSuit)Nothing
twoPair :: Hand -> Maybe (PokerHand, Card) Source
Detect TwoPair and return strongest Card
>>>let sameNum = filter ((==9) . cardNumber) allCards>>>let sameNum' = filter ((==10) . cardNumber) allCards>>>let sameSuit = filter ((==Spades) . cardSuit) allCards>>>twoPair $ Hand (take 2 sameNum ++ take 2 sameNum' ++ take 1 sameSuit)Just (TwoPair,D10)
>>>twoPair $ Hand (take 2 sameNum ++ take 3 sameSuit)Nothing
>>>twoPair $ Hand (take 5 sameSuit)Nothing
onePair :: Hand -> Maybe (PokerHand, Card) Source
Detect onePair and return strongest Card
>>>let sameNum = filter ((==9) . cardNumber) allCards>>>let sameSuit = filter ((==Spades) . cardSuit) allCards>>>onePair $ Hand (take 2 sameNum ++ take 3 sameSuit)Just (OnePair,D9_)
>>>onePair $ Hand (take 5 sameSuit)Nothing
type DiscardList = [Card] Source
drawHand :: Deck -> DiscardList -> Hand -> Maybe (Hand, Deck) Source
Draw cards to make new hand from Deck Return a new Hand and Deck if its possible.
>>>
getHand :: Deck -> Maybe (Hand, Deck) Source
Get hand from deck(Yamafuda)
>>>let Just (hand, newDeck) = getHand allCards>>>handHand {fromHand = [H2_,H3_,H4_,H5_,H6_]}
>>>let Just (_, newDeck') = getHand newDeck>>>take 8 newDeck'[HQ_,HK_,HA_,D2_,D3_,D4_,D5_,D6_]
>>>getHand allCards >>= return . snd >>= getHand >>= return . take 8 . sndJust [HQ_,HK_,HA_,D2_,D3_,D4_,D5_,D6_]
getDiscardList :: Hand -> IO (Maybe DiscardList) Source
Get discardList(Sutefuda) from hand
toIntList :: String -> Maybe [Int] Source
String to [Int] for parse user inputs
>>>toIntList "1234"Just [1,2,3,4]
>>>toIntList "4019"Just [4,0,1,9]
>>>toIntList "z4q01"Nothing
>>>toIntList ""Just []
selectByIndexes :: [a] -> [Int] -> Maybe [a] Source
Get cards by indexes
>>>selectByIndexes "12345" [1..3]Just "123"
>>>selectByIndexes "12345" [10]Nothing
straightFlush :: Hand -> Maybe (PokerHand, Card) Source
Detect StraightFlush and return strongest Card
>>>straightFlush $ Hand (take 5 $ filter ((==Hearts) . cardSuit) allCards)Just (StraightFlush,H6_)
>>>straightFlush $ Hand (take 5 $ filter (\x -> cardSuit x == Hearts && even (cardNumber x)) allCards)Nothing
>>>let sameSuit = filter ((==Hearts) . cardSuit) allCards>>>let sameSuit' = filter ((==Spades) . cardSuit) allCards>>>straightFlush $ Hand (take 3 sameSuit ++ take 2 (drop 3 sameSuit'))Nothing
>>>straightFlush $ Hand (take 5 $ filter (even . cardNumber) allCards)Nothing