{-# LANGUAGE Safe #-}

{- |
Module       :  Control.Monad.Random.Strict
Copyright    :  (c) Brent Yorgey 2016
License      :  BSD3 (see LICENSE)

Maintainer   :  byorgey@gmail.com
Stability    :  experimental
Portability  :  non-portable (multi-param classes, functional dependencies, undecidable instances)

Random monads that are strict in the generator state.  For a lazy
version, see "Control.Monad.Random.Lazy", which has the same
interface.
-}

module Control.Monad.Random.Strict
    ( -- * The Rand monad transformer
      Rand,
      liftRand,
      runRand,
      evalRand,
      execRand,
      mapRand,
      withRand,
      evalRandIO,
      -- * The RandT monad transformer
      RandT,
      liftRandT,
      runRandT,
      evalRandT,
      execRandT,
      mapRandT,
      withRandT,
      evalRandTIO,
      -- * Some convenience re-exports

      module System.Random,
      module Control.Monad.Random.Class,
      module Control.Monad,
      module Control.Monad.Fix,
      module Control.Monad.Trans,
    ) where

import           System.Random hiding (uniform, uniformR)

import           Control.Monad.Random.Class

import           Control.Monad.Trans
import           Control.Monad.Trans.Random.Strict (Rand, RandT, evalRand,
                                                    evalRandIO, evalRandT,
                                                    evalRandTIO, execRand,
                                                    execRandT, liftRand,
                                                    liftRandT, mapRand,
                                                    mapRandT, runRand, runRandT,
                                                    withRand, withRandT)

import           Control.Monad
import           Control.Monad.Fix