foundation-0.0.30: Alternative prelude with batteries and no dependencies

License | BSD-style
Stability | experimental
Portability | Good
Safe Haskell | None
Language | Haskell2010

Foundation.Random

Description

This module deals with the random subsystem abstractions.

It provide 2 different set of abstractions:

- The first abstraction that allow a monad to generate random through the `MonadRandom` class.
- The second abstraction to make generic random generator `RandomGen` and a small State monad like wrapper `MonadRandomState` to abstract a generator.

Synopsis

- class (Functor m, Applicative m, Monad m) => MonadRandom (m :: Type -> Type) where
  - getRandomBytes :: CountOf Word8 -> m (UArray Word8)
  - getRandomWord64 :: m Word64
  - getRandomF32 :: m Float
  - getRandomF64 :: m Double
- class RandomGen gen where
  - randomNew :: MonadRandom m => m gen
  - randomNewFrom :: UArray Word8 -> Maybe gen
  - randomGenerate :: CountOf Word8 -> gen -> (UArray Word8, gen)
  - randomGenerateWord64 :: gen -> (Word64, gen)
  - randomGenerateF32 :: gen -> (Float, gen)
  - randomGenerateF64 :: gen -> (Double, gen)
- newtype MonadRandomState gen a = MonadRandomState {
  - runRandomState :: gen -> (a, gen)
  }
- withRandomGenerator :: RandomGen gen => gen -> MonadRandomState gen a -> (a, gen)
- type RNG = RNGv1
- type RNGv1 = State

# Documentation

class (Functor m, Applicative m, Monad m) => MonadRandom (m :: Type -> Type) where #

A monad constraint that allows to generate random bytes

Methods

getRandomBytes :: CountOf Word8 -> m (UArray Word8) #

getRandomWord64 :: m Word64 #

getRandomF32 :: m Float #

getRandomF64 :: m Double #

#### Instances

Instances details

MonadRandom IO # |
Instance details Defined in Foundation.Random.Class Methods getRandomBytes :: CountOf Word8 -> IO (UArray Word8) # getRandomWord64 :: IO Word64 # getRandomF32 :: IO Float # getRandomF64 :: IO Double #
RandomGen gen => MonadRandom (MonadRandomState gen) # |
Instance details Defined in Foundation.Random.DRG Methods getRandomBytes :: CountOf Word8 -> MonadRandomState gen (UArray Word8) # getRandomWord64 :: MonadRandomState gen Word64 # getRandomF32 :: MonadRandomState gen Float # getRandomF64 :: MonadRandomState gen Double #

class RandomGen gen where #

A Deterministic Random Generator (DRG) class

Methods

randomNew :: MonadRandom m => m gen #

Initialize a new random generator

randomNewFrom :: UArray Word8 -> Maybe gen #

Initialize a new random generator from a binary seed.

If `Nothing` is returned, then the data is not acceptable for creating a new random generator.

randomGenerate :: CountOf Word8 -> gen -> (UArray Word8, gen) #

Generate N bytes of randomness from a DRG

randomGenerateWord64 :: gen -> (Word64, gen) #

Generate a Word64 from a DRG

randomGenerateF32 :: gen -> (Float, gen) #

randomGenerateF64 :: gen -> (Double, gen) #

newtype MonadRandomState gen a #

A simple Monad class very similar to a State Monad with the state being a RandomGenerator.

Constructors

MonadRandomState |

Fields

- runRandomState :: gen -> (a, gen)

#### Instances

Instances details

RandomGen gen => MonadRandom (MonadRandomState gen) # |
Instance details Defined in Foundation.Random.DRG Methods getRandomBytes :: CountOf Word8 -> MonadRandomState gen (UArray Word8) # getRandomWord64 :: MonadRandomState gen Word64 # getRandomF32 :: MonadRandomState gen Float # getRandomF64 :: MonadRandomState gen Double #
Applicative (MonadRandomState gen) # |

Instance details

Defined in Foundation.Random.DRG

Methods

pure :: a -> MonadRandomState gen a #

(<*>) :: MonadRandomState gen (a -> b) -> MonadRandomState gen a -> MonadRandomState gen b #

liftA2 :: (a -> b -> c) -> MonadRandomState gen a -> MonadRandomState gen b -> MonadRandomState gen c #

(*>) :: MonadRandomState gen a -> MonadRandomState gen b -> MonadRandomState gen b #

(<*) :: MonadRandomState gen a -> MonadRandomState gen b -> MonadRandomState gen a #

Functor (MonadRandomState gen) # |
Instance details Defined in Foundation.Random.DRG Methods fmap :: (a -> b) -> MonadRandomState gen a -> MonadRandomState gen b # (<$) :: a -> MonadRandomState gen b -> MonadRandomState gen a #
Monad (MonadRandomState gen) # |
Instance details Defined in Foundation.Random.DRG Methods (>>=) :: MonadRandomState gen a -> (a -> MonadRandomState gen b) -> MonadRandomState gen b # (>>) :: MonadRandomState gen a -> MonadRandomState gen b -> MonadRandomState gen b # return :: a -> MonadRandomState gen a #

withRandomGenerator :: RandomGen gen => gen -> MonadRandomState gen a -> (a, gen) #

Run a pure computation with a Random Generator in the `MonadRandomState`

type RNG = RNGv1 #

An alias to the default choice of deterministic random number generator

Unless, you want to have the stability of a specific random number generator, e.g. for tests purpose, it's recommended to use this alias so that you would keep up to date with possible bugfixes, or change of algorithms.

type RNGv1 = State #