module Data.Random.Source.PureMT where
import Data.Random.Internal.Words
import Data.Random.Source
import System.Random.Mersenne.Pure64
import Data.StateRef
import Data.Word
import Control.Monad.State
import qualified Control.Monad.ST.Strict as S
import qualified Control.Monad.State.Strict as S
getRandomWordFromMTRef :: ModifyRef sr m PureMT => sr -> m Word64
getRandomWordFromMTRef ref = do
atomicModifyReference ref (swap . randomWord64)
where
swap (a,b) = (b,a)
getRandomByteFromMTRef :: (Monad m, ModifyRef sr m PureMT) => sr -> m Word8
getRandomByteFromMTRef ref = do
x <- atomicModifyReference ref (swap . randomInt)
return (fromIntegral x)
where
swap (a,b) = (b,a)
getRandomDoubleFromMTRef :: (Monad m, ModifyRef sr m PureMT) => sr -> m Double
getRandomDoubleFromMTRef src = liftM wordToDouble (getRandomWordFromMTRef src)
getRandomWordFromMTState :: MonadState PureMT m => m Word64
getRandomWordFromMTState = do
mt <- get
let (ws, newMt) = randomWord64 mt
put newMt
return ws
getRandomByteFromMTState :: MonadState PureMT m => m Word8
getRandomByteFromMTState = do
mt <- get
let (ws, newMt) = randomInt mt
put newMt
return (fromIntegral ws)
getRandomDoubleFromMTState :: MonadState PureMT m => m Double
getRandomDoubleFromMTState = liftM wordToDouble getRandomWordFromMTState
instance MonadRandom (State PureMT) where
getRandomByte = getRandomByteFromMTState
getRandomWord = getRandomWordFromMTState
getRandomDouble = getRandomDoubleFromMTState
instance MonadRandom (S.State PureMT) where
getRandomByte = getRandomByteFromMTState
getRandomWord = getRandomWordFromMTState
getRandomDouble = getRandomDoubleFromMTState
instance (Monad m1, ModifyRef (Ref m2 PureMT) m1 PureMT) => RandomSource m1 (Ref m2 PureMT) where
getRandomByteFrom = getRandomByteFromMTRef
getRandomWordFrom = getRandomWordFromMTRef
getRandomDoubleFrom = getRandomDoubleFromMTRef
instance Monad m => MonadRandom (StateT PureMT m) where
getRandomByte = getRandomByteFromMTState
getRandomWord = getRandomWordFromMTState
getRandomDouble = getRandomDoubleFromMTState
instance Monad m => MonadRandom (S.StateT PureMT m) where
getRandomByte = getRandomByteFromMTState
getRandomWord = getRandomWordFromMTState
getRandomDouble = getRandomDoubleFromMTState
instance (Monad m, ModifyRef (IORef PureMT) m PureMT) => RandomSource m (IORef PureMT) where
getRandomByteFrom = getRandomByteFromMTRef
getRandomWordFrom = getRandomWordFromMTRef
getRandomDoubleFrom = getRandomDoubleFromMTRef
instance (Monad m, ModifyRef (STRef s PureMT) m PureMT) => RandomSource m (STRef s PureMT) where
getRandomByteFrom = getRandomByteFromMTRef
getRandomWordFrom = getRandomWordFromMTRef
getRandomDoubleFrom = getRandomDoubleFromMTRef
instance (Monad m, ModifyRef (TVar PureMT) m PureMT) => RandomSource m (TVar PureMT) where
getRandomByteFrom = getRandomByteFromMTRef
getRandomWordFrom = getRandomWordFromMTRef
getRandomDoubleFrom = getRandomDoubleFromMTRef