module Test.Randomization
( newRandomization
) where
import Internal.Prelude
import Control.Concurrent.STM.TVar (newTVar, readTVar, writeTVar)
import Control.Monad.STM (STM)
import Randomization
import System.Random qualified as Random
newRandomization :: Int -> STM (Randomization STM)
newRandomization seed =
deterministicallyRandomSTM
$ let go g =
DeterministicRandomization $ \n ->
let (bs, g') = Random.genByteString (fromIntegral n) g
in (bs, go g')
in go $ Random.mkStdGen seed
deterministicallyRandomSTM
:: DeterministicRandomization -> STM (Randomization STM)
deterministicallyRandomSTM =
newTVar >=> pure . \ref ->
Randomization $ \n -> do
DeterministicRandomization gen <- readTVar ref
let (bs, gen') = gen n
writeTVar ref $! gen'
pure bs