    {-# 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