monadcryptorandom-0.1: A monad for using CryptoRandomGen




Much like the MonadRandom package (Control.Monad.Random), this module provides plumbing for the CryptoRandomGen generators.



class CRandom a whereSource

CRandom a is much like the Random class from the System.Random module in the random package. The main difference is CRandom builds on crypto-api's CryptoRandomGen, so it allows explicit failure.

crandomR (low,high) g as typically instantiated will generate a value between [low, high] inclusively, swapping the pair if high < low.

Provided instances for crandom g generates randoms between the bounds and between +/- 2^256 for Integer.

The crandomR function has degraded (theoretically unbounded, probabilitically decent) performance the closer your range size (high - low) is to 2^n (from the top).


crandom :: CryptoRandomGen g => g -> Either GenError (a, g)Source

crandomR :: CryptoRandomGen g => (a, a) -> g -> Either GenError (a, g)Source

crandoms :: CryptoRandomGen g => g -> [a]Source

crandomRs :: CryptoRandomGen g => (a, a) -> g -> [a]Source

class MonadError GenError m => MonadCryptoRandom m whereSource

MonadCryptoRandom m represents a monad that can produce random values (or fail with a GenError). It is suggestd you use the CRandT transformer in your monad stack.


data CRandT g m a Source

CRandT is the transformer suggested for MonadCryptoRandom.


type CRand g = CRandT g IdentitySource

Simple users of generators can use CRand for quick and easy generation of randoms. See below for a simple use of newGenIO (from crypto-api), getCRandom, getBytes, and runCRandom.

   getRandPair = do
         int <- getCRandom
         bytes <- getBytes 100
         return (int, bytes)

func =
   g <- newGenIO
   case runCRand getRandPair g of
       Right ((int,bytes), g') -> useRandomVals (int,bytes)
       Left x -> handleGenError x

runCRandT :: CRandT g m a -> g -> m (Either GenError (a, g))Source

evalCRandT :: Monad m => CRandT g m a -> g -> m (Either GenError a)Source

runCRand :: CRand g a -> g -> Either GenError (a, g)Source