[project @ 2000-04-06 00:04:01 by andy]
[ghc-hetmet.git] / ghc / lib / std / Random.lhs
index 09ba145..94aca4b 100644 (file)
@@ -34,14 +34,21 @@ import PrelNum              ( fromInt )
 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}
@@ -184,7 +191,9 @@ instance Random Float where
 \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
@@ -242,7 +251,6 @@ stdNext (StdGen s1 s2) = (z', StdGen s1'' s2'')
                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)
@@ -258,10 +266,6 @@ stdSplit std@(StdGen s1 s2)
                                | 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}
 
 
@@ -275,20 +279,20 @@ getStdGen :: IO StdGen
 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