Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
- 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 fromHand
fromHand :: Hand -> [Card]
toHand :: [Card] -> Maybe Hand Source
Cards to Hard
>>>
toHand allCards
Nothing
>>>
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 2
Just [[H10,D10]]
>>>
fullhouse >>= nOfKindHint 3
Just [[H2_,D2_,C2_]]
>>>
fullhouse >>= nOfKindHint 4
Nothing
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
>>>
hand
Hand {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 . snd
Just [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