module Data.Random.Source
( MonadRandom(..)
, RandomSource(..)
) where
import Data.Word
import Control.Monad
import Data.Random.Internal.Words
class Monad m => MonadRandom m where
getRandomByte :: m Word8
getRandomByte = do
word <- getRandomWord
return (fromIntegral word)
getRandomWord :: m Word64
getRandomWord = do
b0 <- getRandomByte
b1 <- getRandomByte
b2 <- getRandomByte
b3 <- getRandomByte
b4 <- getRandomByte
b5 <- getRandomByte
b6 <- getRandomByte
b7 <- getRandomByte
return (buildWord b0 b1 b2 b3 b4 b5 b6 b7)
getRandomDouble :: m Double
getRandomDouble = do
word <- getRandomWord
return (wordToDouble word)
class Monad m => RandomSource m s where
getRandomByteFrom :: s -> m Word8
getRandomByteFrom src = do
word <- getRandomWordFrom src
return (fromIntegral word)
getRandomWordFrom :: s -> m Word64
getRandomWordFrom src = do
b0 <- getRandomByteFrom src
b1 <- getRandomByteFrom src
b2 <- getRandomByteFrom src
b3 <- getRandomByteFrom src
b4 <- getRandomByteFrom src
b5 <- getRandomByteFrom src
b6 <- getRandomByteFrom src
b7 <- getRandomByteFrom src
return (buildWord b0 b1 b2 b3 b4 b5 b6 b7)
getRandomDoubleFrom :: s -> m Double
getRandomDoubleFrom src = do
word <- getRandomWordFrom src
return (wordToDouble word)
instance Monad m => RandomSource m (m Word8) where
getRandomByteFrom = id
instance Monad m => RandomSource m (m Word64) where
getRandomWordFrom = id