Skip to content

Instantly share code, notes, and snippets.

@lgastako
Last active May 28, 2020 04:08
Show Gist options
  • Save lgastako/9660058bc25b4dbbfd52425db30deb1d to your computer and use it in GitHub Desktop.
Save lgastako/9660058bc25b4dbbfd52425db30deb1d to your computer and use it in GitHub Desktop.
module MonadPoker where
-- https://old.reddit.com/r/haskell/comments/gru0id/haskell_poker_foldm_monadrandom/
import Control.Monad
import Control.Monad.Random
import System.Random.Shuffle
data Rank
= Two
| Three
| Four
| Five
| Six
| Seven
| Eight
| Nine
| Ten
| Jack
| Queen
| King
| Ace
deriving (Bounded, Enum, Eq, Ord, Show)
data Suit
= Spades
| Hearts
| Clubs
| Diamonds
deriving (Bounded, Enum, Eq, Ord, Show)
data Card = Card
{ rank :: Rank
, suit :: Suit
} deriving (Bounded, Eq, Ord, Show)
type Deck = [Card]
data Player = Player
{ name :: String
} deriving (Eq, Show)
type HoleCards = (Card, Card)
deck :: [Card]
deck = Card
<$> universe
<*> universe
universe :: (Bounded a, Enum a) => [a]
universe = [minBound..maxBound]
dealHoleCards :: Deck -> [Player] -> ([(Player, HoleCards)], Deck)
dealHoleCards deck players = (playersWithCards, rest)
where
playersWithCards = zip players holeCards
holeCards = zip firstN nextN
firstN = take n deck
nextN = take n . drop n $ deck
rest = drop (n * 2) deck
n = length players
players' :: [Player]
players' =
[ Player "Bob"
, Player "Jim"
, Player "Joe"
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment