{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Random.Class (
MonadRandom(..),
MonadSplit(..),
MonadInterleave(..),
fromList,
fromListMay,
uniform,
uniformMay,
weighted,
weightedMay
) where
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont
import Control.Monad.Trans.Except
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS
import qualified Control.Monad.Trans.RWS.Strict as StrictRWS
import qualified Control.Monad.Trans.State.Lazy as LazyState
import qualified Control.Monad.Trans.State.Strict as StrictState
import qualified Control.Monad.Trans.Writer.Lazy as LazyWriter
import qualified Control.Monad.Trans.Writer.Strict as StrictWriter
import qualified System.Random as Random
import qualified Data.Foldable as F
#if MIN_VERSION_base(4,8,0)
#else
import Data.Monoid (Monoid)
#endif
class (Monad m) => MonadRandom m where
getRandomR :: (Random.Random a) => (a, a) -> m a
getRandom :: (Random.Random a) => m a
getRandomRs :: (Random.Random a) => (a, a) -> m [a]
getRandoms :: (Random.Random a) => m [a]
instance MonadRandom IO where
getRandomR :: forall a. Random a => (a, a) -> IO a
getRandomR = (a, a) -> IO a
forall a (m :: * -> *). (Random a, MonadIO m) => (a, a) -> m a
Random.randomRIO
getRandom :: forall a. Random a => IO a
getRandom = IO a
forall a (m :: * -> *). (Random a, MonadIO m) => m a
Random.randomIO
getRandomRs :: forall a. Random a => (a, a) -> IO [a]
getRandomRs (a, a)
lohi = (StdGen -> [a]) -> IO StdGen -> IO [a]
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((a, a) -> StdGen -> [a]
forall a g. (Random a, RandomGen g) => (a, a) -> g -> [a]
forall g. RandomGen g => (a, a) -> g -> [a]
Random.randomRs (a, a)
lohi) IO StdGen
forall (m :: * -> *). MonadIO m => m StdGen
Random.newStdGen
getRandoms :: forall a. Random a => IO [a]
getRandoms = (StdGen -> [a]) -> IO StdGen -> IO [a]
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM StdGen -> [a]
forall a g. (Random a, RandomGen g) => g -> [a]
forall g. RandomGen g => g -> [a]
Random.randoms IO StdGen
forall (m :: * -> *). MonadIO m => m StdGen
Random.newStdGen
instance (MonadRandom m) => MonadRandom (ContT r m) where
getRandomR :: forall a. Random a => (a, a) -> ContT r m a
getRandomR = m a -> ContT r m a
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ContT r m a) -> ((a, a) -> m a) -> (a, a) -> ContT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => ContT r m a
getRandom = m a -> ContT r m a
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> ContT r m [a]
getRandomRs = m [a] -> ContT r m [a]
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> ContT r m [a])
-> ((a, a) -> m [a]) -> (a, a) -> ContT r m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => ContT r m [a]
getRandoms = m [a] -> ContT r m [a]
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (ExceptT e m) where
getRandomR :: forall a. Random a => (a, a) -> ExceptT e m a
getRandomR = m a -> ExceptT e m a
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ExceptT e m a)
-> ((a, a) -> m a) -> (a, a) -> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => ExceptT e m a
getRandom = m a -> ExceptT e m a
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> ExceptT e m [a]
getRandomRs = m [a] -> ExceptT e m [a]
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> ExceptT e m [a])
-> ((a, a) -> m [a]) -> (a, a) -> ExceptT e m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => ExceptT e m [a]
getRandoms = m [a] -> ExceptT e m [a]
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (IdentityT m) where
getRandomR :: forall a. Random a => (a, a) -> IdentityT m a
getRandomR = m a -> IdentityT m a
forall (m :: * -> *) a. Monad m => m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> IdentityT m a)
-> ((a, a) -> m a) -> (a, a) -> IdentityT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => IdentityT m a
getRandom = m a -> IdentityT m a
forall (m :: * -> *) a. Monad m => m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> IdentityT m [a]
getRandomRs = m [a] -> IdentityT m [a]
forall (m :: * -> *) a. Monad m => m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> IdentityT m [a])
-> ((a, a) -> m [a]) -> (a, a) -> IdentityT m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => IdentityT m [a]
getRandoms = m [a] -> IdentityT m [a]
forall (m :: * -> *) a. Monad m => m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (MaybeT m) where
getRandomR :: forall a. Random a => (a, a) -> MaybeT m a
getRandomR = m a -> MaybeT m a
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> MaybeT m a) -> ((a, a) -> m a) -> (a, a) -> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => MaybeT m a
getRandom = m a -> MaybeT m a
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> MaybeT m [a]
getRandomRs = m [a] -> MaybeT m [a]
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> MaybeT m [a])
-> ((a, a) -> m [a]) -> (a, a) -> MaybeT m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => MaybeT m [a]
getRandoms = m [a] -> MaybeT m [a]
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (Monoid w, MonadRandom m) => MonadRandom (LazyRWS.RWST r w s m) where
getRandomR :: forall a. Random a => (a, a) -> RWST r w s m a
getRandomR = m a -> RWST r w s m a
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> RWST r w s m a)
-> ((a, a) -> m a) -> (a, a) -> RWST r w s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => RWST r w s m a
getRandom = m a -> RWST r w s m a
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> RWST r w s m [a]
getRandomRs = m [a] -> RWST r w s m [a]
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> RWST r w s m [a])
-> ((a, a) -> m [a]) -> (a, a) -> RWST r w s m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => RWST r w s m [a]
getRandoms = m [a] -> RWST r w s m [a]
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (Monoid w, MonadRandom m) => MonadRandom (StrictRWS.RWST r w s m) where
getRandomR :: forall a. Random a => (a, a) -> RWST r w s m a
getRandomR = m a -> RWST r w s m a
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> RWST r w s m a)
-> ((a, a) -> m a) -> (a, a) -> RWST r w s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => RWST r w s m a
getRandom = m a -> RWST r w s m a
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> RWST r w s m [a]
getRandomRs = m [a] -> RWST r w s m [a]
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> RWST r w s m [a])
-> ((a, a) -> m [a]) -> (a, a) -> RWST r w s m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => RWST r w s m [a]
getRandoms = m [a] -> RWST r w s m [a]
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (ReaderT r m) where
getRandomR :: forall a. Random a => (a, a) -> ReaderT r m a
getRandomR = m a -> ReaderT r m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT r m a)
-> ((a, a) -> m a) -> (a, a) -> ReaderT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => ReaderT r m a
getRandom = m a -> ReaderT r m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> ReaderT r m [a]
getRandomRs = m [a] -> ReaderT r m [a]
forall (m :: * -> *) a. Monad m => m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> ReaderT r m [a])
-> ((a, a) -> m [a]) -> (a, a) -> ReaderT r m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => ReaderT r m [a]
getRandoms = m [a] -> ReaderT r m [a]
forall (m :: * -> *) a. Monad m => m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (LazyState.StateT s m) where
getRandomR :: forall a. Random a => (a, a) -> StateT s m a
getRandomR = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a) -> ((a, a) -> m a) -> (a, a) -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => StateT s m a
getRandom = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> StateT s m [a]
getRandomRs = m [a] -> StateT s m [a]
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> StateT s m [a])
-> ((a, a) -> m [a]) -> (a, a) -> StateT s m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => StateT s m [a]
getRandoms = m [a] -> StateT s m [a]
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m) => MonadRandom (StrictState.StateT s m) where
getRandomR :: forall a. Random a => (a, a) -> StateT s m a
getRandomR = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a) -> ((a, a) -> m a) -> (a, a) -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => StateT s m a
getRandom = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> StateT s m [a]
getRandomRs = m [a] -> StateT s m [a]
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> StateT s m [a])
-> ((a, a) -> m [a]) -> (a, a) -> StateT s m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => StateT s m [a]
getRandoms = m [a] -> StateT s m [a]
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m, Monoid w) => MonadRandom (LazyWriter.WriterT w m) where
getRandomR :: forall a. Random a => (a, a) -> WriterT w m a
getRandomR = m a -> WriterT w m a
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> WriterT w m a)
-> ((a, a) -> m a) -> (a, a) -> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => WriterT w m a
getRandom = m a -> WriterT w m a
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> WriterT w m [a]
getRandomRs = m [a] -> WriterT w m [a]
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> WriterT w m [a])
-> ((a, a) -> m [a]) -> (a, a) -> WriterT w m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => WriterT w m [a]
getRandoms = m [a] -> WriterT w m [a]
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
instance (MonadRandom m, Monoid w) => MonadRandom (StrictWriter.WriterT w m) where
getRandomR :: forall a. Random a => (a, a) -> WriterT w m a
getRandomR = m a -> WriterT w m a
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> WriterT w m a)
-> ((a, a) -> m a) -> (a, a) -> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m a
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR
getRandom :: forall a. Random a => WriterT w m a
getRandom = m a -> WriterT w m a
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
getRandomRs :: forall a. Random a => (a, a) -> WriterT w m [a]
getRandomRs = m [a] -> WriterT w m [a]
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m [a] -> WriterT w m [a])
-> ((a, a) -> m [a]) -> (a, a) -> WriterT w m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> m [a]
forall a. Random a => (a, a) -> m [a]
forall (m :: * -> *) a.
(MonadRandom m, Random a) =>
(a, a) -> m [a]
getRandomRs
getRandoms :: forall a. Random a => WriterT w m [a]
getRandoms = m [a] -> WriterT w m [a]
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m [a]
forall a. Random a => m [a]
forall (m :: * -> *) a. (MonadRandom m, Random a) => m [a]
getRandoms
class (Monad m) => MonadSplit g m | m -> g where
getSplit :: m g
instance MonadSplit Random.StdGen IO where
getSplit :: IO StdGen
getSplit = IO StdGen
forall (m :: * -> *). MonadIO m => m StdGen
Random.newStdGen
instance (MonadSplit g m) => MonadSplit g (ContT r m) where
getSplit :: ContT r m g
getSplit = m g -> ContT r m g
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (ExceptT e m) where
getSplit :: ExceptT e m g
getSplit = m g -> ExceptT e m g
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (IdentityT m) where
getSplit :: IdentityT m g
getSplit = m g -> IdentityT m g
forall (m :: * -> *) a. Monad m => m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (MaybeT m) where
getSplit :: MaybeT m g
getSplit = m g -> MaybeT m g
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (Monoid w, MonadSplit g m) => MonadSplit g (LazyRWS.RWST r w s m) where
getSplit :: RWST r w s m g
getSplit = m g -> RWST r w s m g
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (Monoid w, MonadSplit g m) => MonadSplit g (StrictRWS.RWST r w s m) where
getSplit :: RWST r w s m g
getSplit = m g -> RWST r w s m g
forall (m :: * -> *) a. Monad m => m a -> RWST r w s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (ReaderT r m) where
getSplit :: ReaderT r m g
getSplit = m g -> ReaderT r m g
forall (m :: * -> *) a. Monad m => m a -> ReaderT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (LazyState.StateT s m) where
getSplit :: StateT s m g
getSplit = m g -> StateT s m g
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (MonadSplit g m) => MonadSplit g (StrictState.StateT s m) where
getSplit :: StateT s m g
getSplit = m g -> StateT s m g
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (Monoid w, MonadSplit g m) => MonadSplit g (LazyWriter.WriterT w m) where
getSplit :: WriterT w m g
getSplit = m g -> WriterT w m g
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
instance (Monoid w, MonadSplit g m) => MonadSplit g (StrictWriter.WriterT w m) where
getSplit :: WriterT w m g
getSplit = m g -> WriterT w m g
forall (m :: * -> *) a. Monad m => m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m g
forall g (m :: * -> *). MonadSplit g m => m g
getSplit
class MonadRandom m => MonadInterleave m where
interleave :: m a -> m a
instance (MonadInterleave m) => MonadInterleave (ContT r m) where
interleave :: forall a. ContT r m a -> ContT r m a
interleave = (m r -> m r) -> ContT r m a -> ContT r m a
forall {k} (m :: k -> *) (r :: k) a.
(m r -> m r) -> ContT r m a -> ContT r m a
mapContT m r -> m r
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (ExceptT e m) where
interleave :: forall a. ExceptT e m a -> ExceptT e m a
interleave = (m (Either e a) -> m (Either e a))
-> ExceptT e m a -> ExceptT e m a
forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ExceptT e m a -> ExceptT e' n b
mapExceptT m (Either e a) -> m (Either e a)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (IdentityT m) where
interleave :: forall a. IdentityT m a -> IdentityT m a
interleave = (m a -> m a) -> IdentityT m a -> IdentityT m a
forall {k1} {k2} (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2).
(m a -> n b) -> IdentityT m a -> IdentityT n b
mapIdentityT m a -> m a
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (MaybeT m) where
interleave :: forall a. MaybeT m a -> MaybeT m a
interleave = (m (Maybe a) -> m (Maybe a)) -> MaybeT m a -> MaybeT m a
forall (m :: * -> *) a (n :: * -> *) b.
(m (Maybe a) -> n (Maybe b)) -> MaybeT m a -> MaybeT n b
mapMaybeT m (Maybe a) -> m (Maybe a)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (Monoid w, MonadInterleave m) => MonadInterleave (LazyRWS.RWST r w s m) where
interleave :: forall a. RWST r w s m a -> RWST r w s m a
interleave = (m (a, s, w) -> m (a, s, w)) -> RWST r w s m a -> RWST r w s m a
forall (m :: * -> *) a s w (n :: * -> *) b w' r.
(m (a, s, w) -> n (b, s, w')) -> RWST r w s m a -> RWST r w' s n b
LazyRWS.mapRWST m (a, s, w) -> m (a, s, w)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (Monoid w, MonadInterleave m) => MonadInterleave (StrictRWS.RWST r w s m) where
interleave :: forall a. RWST r w s m a -> RWST r w s m a
interleave = (m (a, s, w) -> m (a, s, w)) -> RWST r w s m a -> RWST r w s m a
forall (m :: * -> *) a s w (n :: * -> *) b w' r.
(m (a, s, w) -> n (b, s, w')) -> RWST r w s m a -> RWST r w' s n b
StrictRWS.mapRWST m (a, s, w) -> m (a, s, w)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (ReaderT r m) where
interleave :: forall a. ReaderT r m a -> ReaderT r m a
interleave = (m a -> m a) -> ReaderT r m a -> ReaderT r m a
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT m a -> m a
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (LazyState.StateT s m) where
interleave :: forall a. StateT s m a -> StateT s m a
interleave = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
LazyState.mapStateT m (a, s) -> m (a, s)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (MonadInterleave m) => MonadInterleave (StrictState.StateT s m) where
interleave :: forall a. StateT s m a -> StateT s m a
interleave = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
StrictState.mapStateT m (a, s) -> m (a, s)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (Monoid w, MonadInterleave m) => MonadInterleave (LazyWriter.WriterT w m) where
interleave :: forall a. WriterT w m a -> WriterT w m a
interleave = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
LazyWriter.mapWriterT m (a, w) -> m (a, w)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
instance (Monoid w, MonadInterleave m) => MonadInterleave (StrictWriter.WriterT w m) where
interleave :: forall a. WriterT w m a -> WriterT w m a
interleave = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
StrictWriter.mapWriterT m (a, w) -> m (a, w)
forall a. m a -> m a
forall (m :: * -> *) a. MonadInterleave m => m a -> m a
interleave
weighted :: (F.Foldable t, MonadRandom m) => t (a, Rational) -> m a
weighted :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t (a, Rational) -> m a
weighted t (a, Rational)
t = do
Maybe a
ma <- t (a, Rational) -> m (Maybe a)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t (a, Rational) -> m (Maybe a)
weightedMay t (a, Rational)
t
case Maybe a
ma of
Maybe a
Nothing -> [Char] -> m a
forall a. HasCallStack => [Char] -> a
error [Char]
"Control.Monad.Random.Class.weighted: empty collection, or total weight <= 0"
Just a
a -> a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
weightedMay :: (F.Foldable t, MonadRandom m) => t (a, Rational) -> m (Maybe a)
weightedMay :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t (a, Rational) -> m (Maybe a)
weightedMay = [(a, Rational)] -> m (Maybe a)
forall (m :: * -> *) a.
MonadRandom m =>
[(a, Rational)] -> m (Maybe a)
fromListMay ([(a, Rational)] -> m (Maybe a))
-> (t (a, Rational) -> [(a, Rational)])
-> t (a, Rational)
-> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t (a, Rational) -> [(a, Rational)]
forall a. t a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList
fromList :: (MonadRandom m) => [(a, Rational)] -> m a
fromList :: forall (m :: * -> *) a. MonadRandom m => [(a, Rational)] -> m a
fromList [(a, Rational)]
ws = do
Maybe a
ma <- [(a, Rational)] -> m (Maybe a)
forall (m :: * -> *) a.
MonadRandom m =>
[(a, Rational)] -> m (Maybe a)
fromListMay [(a, Rational)]
ws
case Maybe a
ma of
Maybe a
Nothing -> [Char] -> m a
forall a. HasCallStack => [Char] -> a
error [Char]
"Control.Monad.Random.Class.fromList: empty list, or total weight = 0"
Just a
a -> a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
fromListMay :: (MonadRandom m) => [(a, Rational)] -> m (Maybe a)
fromListMay :: forall (m :: * -> *) a.
MonadRandom m =>
[(a, Rational)] -> m (Maybe a)
fromListMay [(a, Rational)]
xs = do
let s :: Double
s = Rational -> Double
forall a. Fractional a => Rational -> a
fromRational ([Rational] -> Rational
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (((a, Rational) -> Rational) -> [(a, Rational)] -> [Rational]
forall a b. (a -> b) -> [a] -> [b]
map (a, Rational) -> Rational
forall a b. (a, b) -> b
snd [(a, Rational)]
xs)) :: Double
cums :: [(a, Rational)]
cums = ((a, Rational) -> (a, Rational) -> (a, Rational))
-> [(a, Rational)] -> [(a, Rational)]
forall a. (a -> a -> a) -> [a] -> [a]
scanl1 (\ ~(a
_,Rational
q) ~(a
y,Rational
s') -> (a
y, Rational
s'Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+Rational
q)) [(a, Rational)]
xs
case Double
s Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0 of
Bool
True -> Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
Bool
_ -> do
Rational
p <- (Double -> Rational) -> m Double -> m Rational
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Double -> Rational
forall a. Real a => a -> Rational
toRational (m Double -> m Rational) -> m Double -> m Rational
forall a b. (a -> b) -> a -> b
$ (Double, Double) -> m Double
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR (Double
0, Double
s)
Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a -> m (Maybe a))
-> ([(a, Rational)] -> Maybe a) -> [(a, Rational)] -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a)
-> ([(a, Rational)] -> a) -> [(a, Rational)] -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Rational) -> a
forall a b. (a, b) -> a
fst ((a, Rational) -> a)
-> ([(a, Rational)] -> (a, Rational)) -> [(a, Rational)] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, Rational)] -> (a, Rational)
forall a. HasCallStack => [a] -> a
head ([(a, Rational)] -> (a, Rational))
-> ([(a, Rational)] -> [(a, Rational)])
-> [(a, Rational)]
-> (a, Rational)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a, Rational) -> Bool) -> [(a, Rational)] -> [(a, Rational)]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile ((Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
p) (Rational -> Bool)
-> ((a, Rational) -> Rational) -> (a, Rational) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Rational) -> Rational
forall a b. (a, b) -> b
snd) ([(a, Rational)] -> m (Maybe a)) -> [(a, Rational)] -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ [(a, Rational)]
cums
uniform :: (F.Foldable t, MonadRandom m) => t a -> m a
uniform :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t a -> m a
uniform t a
t = do
Maybe a
ma <- t a -> m (Maybe a)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t a -> m (Maybe a)
uniformMay t a
t
case Maybe a
ma of
Maybe a
Nothing -> [Char] -> m a
forall a. HasCallStack => [Char] -> a
error [Char]
"Control.Monad.Random.Class.uniform: empty collection"
Just a
a -> a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
uniformMay :: (F.Foldable t, MonadRandom m) => t a -> m (Maybe a)
uniformMay :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadRandom m) =>
t a -> m (Maybe a)
uniformMay = [(a, Rational)] -> m (Maybe a)
forall (m :: * -> *) a.
MonadRandom m =>
[(a, Rational)] -> m (Maybe a)
fromListMay ([(a, Rational)] -> m (Maybe a))
-> (t a -> [(a, Rational)]) -> t a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> (a, Rational)) -> [a] -> [(a, Rational)]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Rational -> (a, Rational)) -> Rational -> a -> (a, Rational)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) Rational
1) ([a] -> [(a, Rational)]) -> (t a -> [a]) -> t a -> [(a, Rational)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t a -> [a]
forall a. t a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList