module System.Random.Pick (
     pickOne
   , flipCoin

   -- * \"Internal\" functions
   , pickOne'
   , flipCoin'
   ) where

import System.Random.TF.Gen (TFGen)
import System.Random.TF.Instances (randomR)

import System.Random.Rando.Internal (inIO)

pickOne :: [x] -> IO x
pickOne l = inIO $ pickOne' l

pickOne' :: [x] -> TFGen -> (x, TFGen)
pickOne' l g0 =
   let (ix, g1) =
          randomR (0, (length::[a]->Int) l - 1) g0
   in (l !! ix, g1)

flipCoin :: IO Bool
flipCoin = inIO $ flipCoin'

flipCoin' :: TFGen -> (Bool, TFGen)
flipCoin' = pickOne' [True, False]