-- | Tirages.
module Htirage.Draw where

import Htirage.Bits
import Htirage.Combin

-- | @draw1 xs bs@ retourne un choix parmi 'xs' déterminé par l’entropie 'bs'.
draw1 :: [a] -> [Bool] -> a
draw1 xs bs = xs !! fromInteger (randomIntegerOfBits (toInteger (length xs - 1)) bs)

-- | @drawMany xs k bs@ retourne 'k' choix (sans répétition) parmi 'xs'
-- déterminés par l’entropie 'bs'.
drawMany :: [a] -> Integer -> [Bool] -> [a]
drawMany xs k bs = (fromInteger <$> combinOfRank n k r) `permute` xs
	where n = toInteger (length xs)
	      r = randomIntegerOfBits ((n`nCk`k) - 1) bs