[project @ 2003-08-30 23:01:48 by ross]
[haskell-directory.git] / System / Random.hs
index 47e3a48..09a4a39 100644 (file)
@@ -44,20 +44,31 @@ module System.Random
 
 import Prelude
 
+#ifdef __NHC__
+import CPUTime         ( getCPUTime )
+import Foreign.Ptr      ( Ptr, nullPtr )
+#else
 import System.CPUTime  ( getCPUTime )
 import System.Time     ( getClockTime, ClockTime(..) )
+#endif
 import Data.Char       ( isSpace, chr, ord )
 import System.IO.Unsafe ( unsafePerformIO )
 import Data.IORef
 import Numeric         ( readDec )
 
-#ifdef __GLASGOW_HASKELL__
-import GHC.IOBase      ( stToIO )
+-- The standard nhc98 implementation of Time.ClockTime does not match
+-- the extended one expected in this module, so we lash-up a quick
+-- replacement here.
+#ifdef __NHC__
+data ClockTime = TOD Integer ()
+foreign import ccall "time.h time" readtime :: Ptr () -> IO Int
+getClockTime :: IO ClockTime
+getClockTime = do t <- readtime nullPtr;  return (TOD (toInteger t) ())
 #endif
 
 {- $intro
 
-The "Random" library deals with the common task of pseudo-random
+This library deals with the common task of pseudo-random
 number generation. The library makes it possible to generate
 repeatable results, by starting with a specified initial random
 number generator; or to get different results on each run by using the 
@@ -106,8 +117,8 @@ class RandomGen g where
    -- default mathod
    genRange g = (minBound,maxBound)
 
-{- |The "Random" library provides one instance of 'RandomGen', the abstract data
-type 'StdGen'.
+{- |The "System.Random" library provides one instance of 'RandomGen', the
+abstract data type 'StdGen'.
 
 The result of repeatedly using next should be at least as statistically robust
 as the /Minimal Standard Random Number Generator/ described by
@@ -223,7 +234,7 @@ class Random a where
 
   -- |Default methods  
   randoms  :: RandomGen g => g -> [a]
-  randoms  g      = x : randoms g' where (x,g') = random g
+  randoms  g      = (\(x,g') -> x : randoms g') (random g)
 
   randomRs :: RandomGen g => (a,a) -> g -> [a]
   randomRs ival g = x : randomRs ival g' where (x,g') = randomR ival g
@@ -377,7 +388,7 @@ newStdGen = do
 
 {- |'getStdRandom' uses the supplied function to get a value from the current
 global random generator, and updates the global generator with the new generator
-returned by the function. For example, 'rollDice' gets a random integer between 1 and 6: 
+returned by the function. For example, @rollDice@ gets a random integer between 1 and 6: 
 
 >  rollDice :: IO Int
 >  rollDice = getStdRandom (randomR (1,6))