-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | The etude of the Haskell programming -- -- poker like a JAVA @package java-poker @version 0.1.2.0 module Game.Poker.Cards -- | 4 types of card -- --
-- >>> Hearts -- Show -- Hearts ---- --
-- >>> read "Hearts" :: Suit -- Read -- Hearts ---- --
-- >>> Hearts == Hearts -- Eq -- True ---- --
-- >>> Hearts == Spades -- Eq -- False ---- --
-- >>> Hearts < Diamonds -- Ord -- True ---- --
-- >>> succ Hearts -- Enum -- Diamonds --data Suit Hearts :: Suit Diamonds :: Suit Clubs :: Suit Spades :: Suit -- | One playing card -- --
-- >>> Card 1 Hearts == Card 2 Hearts -- Eq -- False ---- --
-- >>> Card 1 Hearts < Card 2 Hearts -- Ord -- True --data Card -- | All cards -- --
-- >>> length allCards -- 52 ---- --
-- >>> take 13 $ allCards -- [H2_,H3_,H4_,H5_,H6_,H7_,H8_,H9_,H10,HJ_,HQ_,HK_,HA_] ---- --
-- >>> reverse $ take 13 $ reverse allCards -- [S2_,S3_,S4_,S5_,S6_,S7_,S8_,S9_,S10,SJ_,SQ_,SK_,SA_] --allCards :: [Card] -- | Get Suit from card -- --
-- >>> cardSuit $ Card 10 Hearts -- Hearts --cardSuit :: Card -> Suit -- | Get Suit from card -- --
-- >>> cardNumber $ Card 10 Hearts -- 10 --cardNumber :: Card -> Int -- | Stregnth of card -- --
-- >>> cardStrength . head $ allCards -- 2 --cardStrength :: Card -> Int instance GHC.Classes.Ord Game.Poker.Cards.Card instance GHC.Classes.Eq Game.Poker.Cards.Card instance GHC.Enum.Enum Game.Poker.Cards.Suit instance GHC.Classes.Ord Game.Poker.Cards.Suit instance GHC.Classes.Eq Game.Poker.Cards.Suit instance GHC.Read.Read Game.Poker.Cards.Suit instance GHC.Show.Show Game.Poker.Cards.Suit instance GHC.Show.Show Game.Poker.Cards.Card module Game.Poker.Hands -- | Constrained cards in hand -- --
-- >>> :type fromHand -- fromHand :: Hand -> [Card] --data Hand -- | Cards to Hard -- --
-- >>> toHand allCards -- Nothing ---- --
-- >>> fmap (length . fromHand) (toHand $ take 5 allCards) -- Just 5 --toHand :: [Card] -> Maybe Hand fromHand :: Hand -> [Card] -- | 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_) --pokerHand :: Hand -> (PokerHand, Card) data PokerHand -- | 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 --straightHint :: Hand -> Maybe Card -- | 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 --flushHint :: Hand -> Maybe Card -- | 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 --nOfKindHint :: Int -> Hand -> Maybe [[Card]] -- | 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 --fourOfAKind :: Hand -> Maybe (PokerHand, Card) -- | 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 --fullHouse :: Hand -> Maybe (PokerHand, Card) -- | 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 --flush :: Hand -> Maybe (PokerHand, Card) -- | 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 --straight :: Hand -> Maybe (PokerHand, Card) -- | 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 --threeOfAKind :: Hand -> Maybe (PokerHand, Card) -- | 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 --twoPair :: Hand -> Maybe (PokerHand, Card) -- | 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 --onePair :: Hand -> Maybe (PokerHand, Card) type DiscardList = [Card] type Deck = [Card] -- | Draw cards to make new hand from Deck Return a new Hand and Deck if -- its possible. -- --
-- >>> --drawHand :: Deck -> DiscardList -> Hand -> Maybe (Hand, Deck) -- | 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_] --getHand :: Deck -> Maybe (Hand, Deck) -- | Get discardList(Sutefuda) from hand getDiscardList :: Hand -> IO (Maybe DiscardList) -- | 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 [] --toIntList :: String -> Maybe [Int] -- | Get cards by indexes -- --
-- >>> selectByIndexes "12345" [1..3] -- Just "123" ---- --
-- >>> selectByIndexes "12345" [10] -- Nothing --selectByIndexes :: [a] -> [Int] -> Maybe [a] -- | 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 --straightFlush :: Hand -> Maybe (PokerHand, Card) -- | Judge victory you and AI -- --
-- >>> --judgeVictory :: (PokerHand, Card) -> (PokerHand, Card) -> Ordering instance GHC.Enum.Enum Game.Poker.Hands.PokerHand instance GHC.Classes.Ord Game.Poker.Hands.PokerHand instance GHC.Classes.Eq Game.Poker.Hands.PokerHand instance GHC.Read.Read Game.Poker.Hands.PokerHand instance GHC.Show.Show Game.Poker.Hands.PokerHand instance GHC.Classes.Ord Game.Poker.Hands.Hand instance GHC.Classes.Eq Game.Poker.Hands.Hand instance GHC.Show.Show Game.Poker.Hands.Hand module Game.Poker.AI -- | Sutefuda by AI -- --
-- >>> let Just straightFlush = toHand $ take 5 $ allCards -- -- >>> aiSelectDiscards straightFlush -- [] ---- --
-- >>> let Just fourCard = toHand $ take 5 $ (filter ((==10) . cardNumber) allCards) ++ allCards -- -- >>> aiSelectDiscards fourCard -- [H2_] ---- --
-- >>> let Just buta = toHand $ take 5 $ (take 2 allCards) ++ (take 2 $ drop (13+5) allCards) ++ (drop (13*2+9) allCards) -- -- >>> aiSelectDiscards buta -- [H2_,H3_,D7_,D8_,CJ_] --aiSelectDiscards :: Hand -> DiscardList -- | Sutefuda = Hand - allYaku -- --
-- >>> let Just (x) = toHand $ take 5 $ (filter (\x -> (cardNumber x == 10)) $ allCards) ++ allCards -- -- >>> fromHand x -- [H2_,H10,D10,C10,S10] -- -- >>> nOfKindDiscards x -- [H2_] --nOfKindDiscards :: Hand -> DiscardList module Game.Poker.Simple simpleGame :: IO () instance GHC.Classes.Eq Game.Poker.Simple.Player module Game.Poker