import PrelShow ( showSignedInt, showSpace )
import PrelRead ( readDec )
import PrelIOBase ( unsafePerformIO, stToIO )
-import PrelArr ( MutableVar, newVar, readVar, writeVar )
+import PrelArr ( STRef, newSTRef, readSTRef, writeSTRef )
import PrelReal ( toInt )
-import CPUTime ( getCPUTime )
import PrelFloat ( float2Double, double2Float )
import Time ( getClockTime, ClockTime(..) )
+#else
+import PrelPrim ( IORef
+ , newIORef
+ , readIORef
+ , writeIORef
+ , unsafePerformIO
+ )
#endif
-import Char ( isSpace, chr, ord )
+import CPUTime ( getCPUTime )
+import Char ( isSpace, chr, ord )
\end{code}
\begin{code}
\begin{code}
#ifdef __HUGS__
mkStdRNG :: Integer -> IO StdGen
-mkStdRNG o = return (createStdGen o)
+mkStdRNG o = do
+ ct <- getCPUTime
+ return (createStdGen (ct + o))
#else
mkStdRNG :: Integer -> IO StdGen
mkStdRNG o = do
s2' = 40692 * (s2 - k' * 52774) - k' * 3791
s2'' = if s2' < 0 then s2' + 2147483399 else s2'
-#ifdef __HUGS__
stdSplit :: StdGen -> (StdGen, StdGen)
stdSplit std@(StdGen s1 s2)
= (left, right)
| otherwise = s2 - 1
StdGen t1 t2 = snd (next std)
-#else
-stdSplit :: StdGen -> (StdGen, StdGen)
-stdSplit std@(StdGen s1 _) = (std, unsafePerformIO (mkStdRNG (fromInt s1)))
-#endif
\end{code}
getStdGen = readIORef theStdGen
theStdGen :: IORef StdGen
-theStdGen = primRunST (newIORef (createStdGen 0))
+theStdGen = unsafePerformIO (newIORef (createStdGen 0))
#else
-global_rng :: MutableVar RealWorld StdGen
+global_rng :: STRef RealWorld StdGen
global_rng = unsafePerformIO $ do
rng <- mkStdRNG 0
- stToIO (newVar rng)
+ stToIO (newSTRef rng)
setStdGen :: StdGen -> IO ()
-setStdGen sgen = stToIO (writeVar global_rng sgen)
+setStdGen sgen = stToIO (writeSTRef global_rng sgen)
getStdGen :: IO StdGen
-getStdGen = stToIO (readVar global_rng)
+getStdGen = stToIO (readSTRef global_rng)
#endif