{-# 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

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