-- | Generation of random numbers via "Crypto.RNG.Unsafe". module Effectful.Crypto.RNG.Unsafe ( -- * Effect RNG(..) , CryptoRNG(..) -- ** Handlers , runRNG -- * Instantiation of the initial RNG state , RNGState , newRNGState ) where import Crypto.RNG.Unsafe import Effectful import Effectful.Dispatch.Dynamic import qualified System.Random as R import Effectful.Crypto.RNG.Effect -- | Generate random numbers, starting with a given initial 'RNGState'. -- -- /Note:/ random numbers generated by this interpreter are not -- cryptographically secure and should only be used for testing purposes. runRNG :: IOE :> es => RNGState -> Eff (RNG : es) a -> Eff es a runRNG rng = interpret $ \_ -> \case RandomBytes n -> withRNG rng $ \g -> R.genByteString n g Random -> withRNG rng $ \g -> R.uniform g RandomR bounds -> withRNG rng $ \g -> R.uniformR bounds g