bliplib-0.1.0: src/Blip/MarshalDouble.hs
-----------------------------------------------------------------------------
-- |
-- Module : Blip.MarshalDouble
-- Copyright : (c) 2012, 2013 Bernie Pope
-- License : BSD-style
-- Maintainer : florbitous@gmail.com
-- Stability : experimental
-- Portability : ghc
--
-- Convert Haskell Doubles to and from a list of bytes.
--
-- XXX not sure if this is complete or immune from endian issues.
--
-----------------------------------------------------------------------------
module Blip.MarshalDouble (doubleToBytes, bytesToDouble) where
import Foreign.Storable (peek, peekByteOff, pokeByteOff)
import Foreign.Marshal.Utils (with)
import Foreign.Marshal.Alloc (alloca)
import Data.Word (Word8)
import Control.Monad (forM, forM_)
import System.IO.Unsafe (unsafePerformIO)
doubleToBytes :: Double -> [Word8]
doubleToBytes = unsafePerformIO . doubleToBytesIO
doubleToBytesIO :: Double -> IO [Word8]
doubleToBytesIO d =
with d $ \ptr ->
forM [0..7] $ \index ->
peekByteOff ptr index
bytesToDouble :: [Word8] -> Double
bytesToDouble = unsafePerformIO . bytesToDoubleIO
bytesToDoubleIO :: [Word8] -> IO Double
bytesToDoubleIO bs =
alloca $ \ptr -> do
forM_ (zip [0..7] bs) $ \(index, byte) ->
pokeByteOff ptr index byte
peek ptr