{-# LANGUAGE CPP #-}
-- | Initialization of global generator.
module System.Random.SplitMix.Init (
    initialSeed,
) where

import Data.Word (Word64)

#if defined(SPLITMIX_INIT_GHCJS) && __GHCJS__

import Data.Word (Word32)

#else
#if defined(SPLITMIX_INIT_C)

#else

import Data.Bits             (xor)
import Data.Time.Clock.POSIX (getPOSIXTime)
#if !__GHCJS__
import System.CPUTime (cpuTimePrecision, getCPUTime)
#endif

#endif
#endif

initialSeed :: IO Word64

#if defined(SPLITMIX_INIT_GHCJS) && __GHCJS__

initialSeed = fmap fromIntegral initialSeedJS

foreign import javascript
    "$r = Math.floor(Math.random()*0x100000000);"
    initialSeedJS :: IO Word32

#else
#if defined(SPLITMIX_INIT_C)

initialSeed :: IO Word64
initialSeed = IO Word64
initialSeedC

foreign import ccall "splitmix_init" initialSeedC :: IO Word64

#else

initialSeed =  do
    now <- getPOSIXTime
    let timebits = truncate now :: Word64
#if __GHCJS__
    let cpubits = 0
#else
    cpu <- getCPUTime
    let cpubits = fromIntegral (cpu `div` cpuTimePrecision) :: Word64
#endif
    return $ timebits `xor` cpubits

#endif
#endif