-- 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