module Rand where
import Control.Monad.Random
import qualified Data.Set as S
-- | Argument must be non-empty
randElemUnsafe :: [a] -> Rand StdGen a
randElemUnsafe as = (as!!) <$> getRandomR (0, length as - 1)
randElem :: [a] -> Rand StdGen (Maybe a)
randElem [] = pure Nothing
randElem as = Just <$> randElemUnsafe as
-- | Argument must be non-empty
randMemberUnsafe :: S.Set a -> Rand StdGen a
randMemberUnsafe s = (S.toList s !!) <$> getRandomR (0,S.size s - 1)
randMember :: S.Set a -> Rand StdGen (Maybe a)
randMember s | S.null s = pure Nothing
randMember s = Just <$> randMemberUnsafe s
shuffle :: [a] -> Rand StdGen [a]
shuffle = liftRand . uniformShuffleList