module Terminal.Game.Random ( R.StdGen,
                              R.UniformRange,
                              R.getStdGen,
                              R.mkStdGen,
                              getRandom,
                              pickRandom )
            where

import System.Random as R


-- | Simple, pure pseudo-random generator.
getRandom :: UniformRange a => (a, a) -> StdGen -> (a, StdGen)
getRandom :: (a, a) -> StdGen -> (a, StdGen)
getRandom (a, a)
bs StdGen
sg = (a, a) -> StdGen -> (a, StdGen)
forall g a. (RandomGen g, UniformRange a) => (a, a) -> g -> (a, g)
uniformR (a, a)
bs StdGen
sg

-- | Picks at random from list.
pickRandom :: [a] -> StdGen -> (a, StdGen)
pickRandom :: [a] -> StdGen -> (a, StdGen)
pickRandom [a]
as StdGen
sg = let l :: Int
l = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
as
                       (Int
a, StdGen
sg') = (Int, Int) -> StdGen -> (Int, StdGen)
forall a. UniformRange a => (a, a) -> StdGen -> (a, StdGen)
getRandom (Int
0, Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) StdGen
sg
                   in ([a]
as [a] -> Int -> a
forall a. [a] -> Int -> a
!! Int
a, StdGen
sg')