module Data.Poker.Evaluate
( handValue
, handValue_n
, numericalHandValue
, numericalHandValue_n
, distHandValue
) where
import Data.Poker.Definitions
import Data.Poker.Interface
import Data.Poker.Deck
import Data.Poker.Brute
import Data.Poker.Enumerate
import Foreign.C
import Data.Array.MArray
import Data.Array.ST as ST
import Data.Array.Unboxed
import Data.Array.Base
foreign import ccall unsafe "hs_StdDeck_StdRules_EVAL_N" c_eval_n :: StdDeck_CardMask -> CInt -> CInt
numericalHandValue :: CardSet
-> NumericalHandValue
numericalHandValue mask =
numericalHandValue_n (size mask) mask
numericalHandValue_n :: Int
-> CardSet
-> NumericalHandValue
numericalHandValue_n n (CardSet m)
= NumericalHandValue $ fromIntegral (c_eval_n m (fromIntegral n))
handValue :: CardSet
-> HandValue
handValue = numericalToHandValue . numericalHandValue
handValue_n :: Int
-> CardSet
-> HandValue
handValue_n n = numericalToHandValue . numericalHandValue_n n
distHandValue :: CardSet -> UArray ConsecutiveHandValue Int
distHandValue !mask = runSTUArray (do
arr <- newArray (minBound, maxBound) 0
let step community = do
let !fastValue = numericalHandValue_n 7 (community `union` mask)
let !(ConsecutiveHandValue idx) = numericalToConsecutive fastValue
n <- unsafeRead arr idx
unsafeWrite arr idx (n+1)
enumerateFiveCards mask step
return arr)