random-fu-0.0.0.2: src/Data/Random/Internal/Words.hs
{-
- ``Data/Random/Internal/Words''
-}
-- |A few little functions I found myself writing inline over and over again.
--
-- Note that these need to be checked to ensure proper behavior on big-endian
-- systems. They are probably not right at the moment.
module Data.Random.Internal.Words where
import Foreign
import GHC.IOBase
import Data.Word
import Control.Monad
wordsToBytes :: [Word64] -> [Word8]
wordsToBytes = concatMap wordToBytes
wordToBytes :: Word64 -> [Word8]
wordToBytes x = unsafePerformIO . allocaBytes 8 $ \p -> do
poke (castPtr p) x
mapM (peekElemOff p) [0..7]
bytesToWords :: [Word8] -> [Word64]
bytesToWords = map bytesToWord . chunk 8
where
chunk n [] = []
chunk n xs = case splitAt n xs of
(ys, zs) -> ys : chunk n zs
bytesToWord :: [Word8] -> Word64
bytesToWord bs = unsafePerformIO . allocaBytes 8 $ \p -> do
zipWithM (pokeElemOff p) [0..7] (bs ++ repeat 0)
peek (castPtr p)