This module provides functions useful for implementing new `MonadRandom`

and `RandomSource`

instances for state-abstractions containing `StdGen`

values (the pure pseudorandom generator provided by the System.Random
module in the "random" package), as well as instances for some common
cases.

- getRandomByteFromStdGenIO :: IO Word8
- getRandomWordFromStdGenIO :: IO Word64
- getRandomDoubleFromStdGenIO :: IO Double
- getRandomByteFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word8
- getRandomWordFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word64
- getRandomDoubleFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Double
- getRandomByteFromRandomGenState :: (RandomGen g, MonadState g m) => m Word8
- getRandomWordFromRandomGenState :: (RandomGen g, MonadState g m) => m Word64
- getRandomDoubleFromRandomGenState :: (RandomGen g, MonadState g m) => m Double

# Documentation

getRandomByteFromRandomGenRef :: (Monad m, ModifyRef sr m g, RandomGen g) => sr -> m Word8Source

Given a mutable reference to a `RandomGen`

generator, we can make a
`RandomSource`

usable in any monad in which the reference can be modified.

For example, if `x :: TVar StdGen`

, `getRandomByteFromRandomGenRef x`

can be
used as a `RandomSource`

in `IO`

, `STM`

, or any monad which is an instance
of `MonadIO`

. It's generally probably better to use
`getRandomWordFromRandomGenRef`

though, as this one is likely to throw
away a lot of perfectly good entropy. Better still is to use these 3 functions
together to create a `RandomSource`

instance for the reference you're using,
if one does not already exist.

getRandomByteFromRandomGenState :: (RandomGen g, MonadState g m) => m Word8Source

Similarly, `getRandomWordFromRandomGenState x`

can be used in any "state"
monad in the mtl sense whose state is a `RandomGen`

generator.
Additionally, the standard mtl state monads have `MonadRandom`

instances
which do precisely that, allowing an easy conversion of `RVar`

s and
other `Distribution`

instances to "pure" random variables.

getRandomWordFromRandomGenState :: (RandomGen g, MonadState g m) => m Word64Source

getRandomDoubleFromRandomGenState :: (RandomGen g, MonadState g m) => m DoubleSource