monadcryptorandom-0.7.1: A monad for using CryptoRandomGen

MaintainerThomas.DuBuisson@gmail.com
Stabilitybeta
Portabilityportable
Safe HaskellNone
LanguageHaskell98

Control.Monad.CryptoRandom

Description

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

Synopsis

Documentation

class CRandom a where #

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, probabilistically decent) performance the closer your range size (high - low) is to 2^n (from the top).

Minimal complete definition

crandom

Methods

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

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

class CRandomR a where #

Minimal complete definition

crandomR

Methods

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

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

Instances

CRandomR Int # 

Methods

crandomR :: CryptoRandomGen g => (Int, Int) -> g -> Either GenError (Int, g) #

crandomRs :: CryptoRandomGen g => (Int, Int) -> g -> [Int] #

CRandomR Int8 # 

Methods

crandomR :: CryptoRandomGen g => (Int8, Int8) -> g -> Either GenError (Int8, g) #

crandomRs :: CryptoRandomGen g => (Int8, Int8) -> g -> [Int8] #

CRandomR Int16 # 

Methods

crandomR :: CryptoRandomGen g => (Int16, Int16) -> g -> Either GenError (Int16, g) #

crandomRs :: CryptoRandomGen g => (Int16, Int16) -> g -> [Int16] #

CRandomR Int32 # 

Methods

crandomR :: CryptoRandomGen g => (Int32, Int32) -> g -> Either GenError (Int32, g) #

crandomRs :: CryptoRandomGen g => (Int32, Int32) -> g -> [Int32] #

CRandomR Int64 # 

Methods

crandomR :: CryptoRandomGen g => (Int64, Int64) -> g -> Either GenError (Int64, g) #

crandomRs :: CryptoRandomGen g => (Int64, Int64) -> g -> [Int64] #

CRandomR Integer # 
CRandomR Word8 # 

Methods

crandomR :: CryptoRandomGen g => (Word8, Word8) -> g -> Either GenError (Word8, g) #

crandomRs :: CryptoRandomGen g => (Word8, Word8) -> g -> [Word8] #

CRandomR Word16 # 
CRandomR Word32 # 
CRandomR Word64 # 

class (ContainsGenError e, MonadError e m) => MonadCRandom e m where #

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

Minimal complete definition

getCRandom, getBytes, getBytesWithEntropy, doReseed

Instances

(Monoid w, MonadCRandom e m) => MonadCRandom e (WriterT w m) # 
(Monoid w, MonadCRandom e m) => MonadCRandom e (WriterT w m) # 
MonadCRandom e m => MonadCRandom e (StateT s m) # 
MonadCRandom e m => MonadCRandom e (StateT s m) # 
(ContainsGenError e, Monad m, CryptoRandomGen g) => MonadCRandom e (CRandT g e m) # 
MonadCRandom e m => MonadCRandom e (ReaderT * r m) # 
(Monoid w, MonadCRandom e m) => MonadCRandom e (RWST r w s m) # 

Methods

getCRandom :: CRandom a => RWST r w s m a #

getBytes :: Int -> RWST r w s m ByteString #

getBytesWithEntropy :: Int -> ByteString -> RWST r w s m ByteString #

doReseed :: ByteString -> RWST r w s m () #

(Monoid w, MonadCRandom e m) => MonadCRandom e (RWST r w s m) # 

Methods

getCRandom :: CRandom a => RWST r w s m a #

getBytes :: Int -> RWST r w s m ByteString #

getBytesWithEntropy :: Int -> ByteString -> RWST r w s m ByteString #

doReseed :: ByteString -> RWST r w s m () #

class (ContainsGenError e, MonadError e m) => MonadCRandomR e m where #

Minimal complete definition

getCRandomR

Methods

getCRandomR :: CRandomR a => (a, a) -> m a #

Instances

(MonadCRandomR e m, Monoid w) => MonadCRandomR e (WriterT w m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> WriterT w m a #

(MonadCRandomR e m, Monoid w) => MonadCRandomR e (WriterT w m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> WriterT w m a #

MonadCRandomR e m => MonadCRandomR e (StateT s m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> StateT s m a #

MonadCRandomR e m => MonadCRandomR e (StateT s m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> StateT s m a #

MonadCRandomR e m => MonadCRandomR e (ReaderT * r m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> ReaderT * r m a #

(ContainsGenError e, Monad m, CryptoRandomGen g) => MonadCRandomR e (CRandT g e m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> CRandT g e m a #

(MonadCRandomR e m, Monoid w) => MonadCRandomR e (RWST r w s m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> RWST r w s m a #

(MonadCRandomR e m, Monoid w) => MonadCRandomR e (RWST r w s m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> RWST r w s m a #

newtype CRandT g e m a #

CRandT is the transformer suggested for MonadCRandom.

Constructors

CRandT 

Fields

Instances

Monad m => MonadError e (CRandT g e m) # 

Methods

throwError :: e -> CRandT g e m a #

catchError :: CRandT g e m a -> (e -> CRandT g e m a) -> CRandT g e m a #

MonadReader r m => MonadReader r (CRandT g e m) # 

Methods

ask :: CRandT g e m r #

local :: (r -> r) -> CRandT g e m a -> CRandT g e m a #

reader :: (r -> a) -> CRandT g e m a #

MonadState s m => MonadState s (CRandT g e m) # 

Methods

get :: CRandT g e m s #

put :: s -> CRandT g e m () #

state :: (s -> (a, s)) -> CRandT g e m a #

MonadWriter w m => MonadWriter w (CRandT g e m) # 

Methods

writer :: (a, w) -> CRandT g e m a #

tell :: w -> CRandT g e m () #

listen :: CRandT g e m a -> CRandT g e m (a, w) #

pass :: CRandT g e m (a, w -> w) -> CRandT g e m a #

(ContainsGenError e, Monad m, CryptoRandomGen g) => MonadCRandomR e (CRandT g e m) # 

Methods

getCRandomR :: CRandomR a => (a, a) -> CRandT g e m a #

(ContainsGenError e, Monad m, CryptoRandomGen g) => MonadCRandom e (CRandT g e m) # 
MonadTrans (CRandT g e) # 

Methods

lift :: Monad m => m a -> CRandT g e m a #

Monad m => Monad (CRandT g e m) # 

Methods

(>>=) :: CRandT g e m a -> (a -> CRandT g e m b) -> CRandT g e m b #

(>>) :: CRandT g e m a -> CRandT g e m b -> CRandT g e m b #

return :: a -> CRandT g e m a #

fail :: String -> CRandT g e m a #

Functor m => Functor (CRandT g e m) # 

Methods

fmap :: (a -> b) -> CRandT g e m a -> CRandT g e m b #

(<$) :: a -> CRandT g e m b -> CRandT g e m a #

MonadFix m => MonadFix (CRandT g e m) # 

Methods

mfix :: (a -> CRandT g e m a) -> CRandT g e m a #

Monad m => Applicative (CRandT g e m) # 

Methods

pure :: a -> CRandT g e m a #

(<*>) :: CRandT g e m (a -> b) -> CRandT g e m a -> CRandT g e m b #

(*>) :: CRandT g e m a -> CRandT g e m b -> CRandT g e m b #

(<*) :: CRandT g e m a -> CRandT g e m b -> CRandT g e m a #

MonadIO m => MonadIO (CRandT g e m) # 

Methods

liftIO :: IO a -> CRandT g e m a #

MonadThrow m => MonadThrow (CRandT g e m) #

Throws exceptions into the base monad.

Since: 0.7.1

Methods

throwM :: Exception e => e -> CRandT g e m a #

MonadCatch m => MonadCatch (CRandT g e m) #

Catches exceptions from the base monad.

Since: 0.7.1

Methods

catch :: Exception e => CRandT g e m a -> (e -> CRandT g e m a) -> CRandT g e m a #

MonadCont m => MonadCont (CRandT g e m) # 

Methods

callCC :: ((a -> CRandT g e m b) -> CRandT g e m a) -> CRandT g e m a #

type CRand g e = CRandT g e Identity #

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 = do
  g <- newGenIO
  case runCRand getRandPair g of
    Right ((int,bytes), g') -> useRandomVals (int,bytes)
    Left x -> handleGenError x

runCRandT :: ContainsGenError e => CRandT g e m a -> g -> m (Either e (a, g)) #

evalCRandT :: (ContainsGenError e, Monad m) => CRandT g e m a -> g -> m (Either e a) #

runCRand :: ContainsGenError e => CRand g e a -> g -> Either e (a, g) #

liftCRand :: (g -> Either e (a, g)) -> CRand g e a #

liftCRandT :: Monad m => (g -> Either e (a, g)) -> CRandT g e m a #