{-# 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 qualified Control.Monad.Trans.RWS.Lazy as LazyRWS
import qualified Control.Monad.Trans.RWS.Strict as StrictRWS
import Control.Monad.Trans.Reader
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 Data.Foldable as F
import Data.Word (Word64)
import qualified System.Random as Random
#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 g. RandomGen g => (a, a) -> g -> [a]
forall a g. (Random a, 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 g. RandomGen g => g -> [a]
forall a g. (Random a, 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 :: Rational
s = [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)
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
if Rational
s Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= Rational
0
then 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
else do
Word64
w <- m Word64
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
let p :: Rational
p = Rational
s Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (Rational
1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Word64 -> Rational
forall a. Real a => a -> Rational
toRational (Word64
w :: Word64) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Word64 -> Rational
forall a. Real a => a -> Rational
toRational (Word64
forall a. Bounded a => a
maxBound :: Word64))
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
fromListMayOld :: MonadRandom m => [(a, Rational)] -> m (Maybe a)
fromListMayOld :: forall (m :: * -> *) a.
MonadRandom m =>
[(a, Rational)] -> m (Maybe a)
fromListMayOld [(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
if Double
s Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0
then 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
else 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