{-# LANGUAGE ScopedTypeVariables #-}
module Mcmc.Internal.Random
( saveGen,
loadGen,
)
where
import Data.IORef
import Data.Word
import System.Random.Internal
import System.Random.SplitMix
import System.Random.Stateful
saveGen :: IOGenM StdGen -> IO (Word64, Word64)
saveGen :: IOGenM StdGen -> IO (Word64, Word64)
saveGen (IOGenM IORef StdGen
r) = do
(StdGen SMGen
g) <- IORef StdGen -> IO StdGen
forall a. IORef a -> IO a
readIORef IORef StdGen
r
(Word64, Word64) -> IO (Word64, Word64)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Word64, Word64) -> IO (Word64, Word64))
-> (Word64, Word64) -> IO (Word64, Word64)
forall a b. (a -> b) -> a -> b
$ SMGen -> (Word64, Word64)
unseedSMGen SMGen
g
loadGen :: (Word64, Word64) -> IO (IOGenM StdGen)
loadGen :: (Word64, Word64) -> IO (IOGenM StdGen)
loadGen (Word64, Word64)
s = StdGen -> IO (IOGenM StdGen)
forall (m :: * -> *) g. MonadIO m => g -> m (IOGenM g)
newIOGenM (StdGen -> IO (IOGenM StdGen)) -> StdGen -> IO (IOGenM StdGen)
forall a b. (a -> b) -> a -> b
$ SMGen -> StdGen
StdGen (SMGen -> StdGen) -> SMGen -> StdGen
forall a b. (a -> b) -> a -> b
$ (Word64, Word64) -> SMGen
seedSMGen' (Word64, Word64)
s