-- 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.0.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 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) -- | 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) 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 simpleGame :: IO () instance GHC.Classes.Eq Game.Poker.Player