RabbitMQ-0.1.0.0: Network/AMQP/Binary.hs
{-# LANGUAGE FlexibleContexts #-}
module Network.AMQP.Binary
( getFloat32be, putFloat32be
, getFloat64be, putFloat64be
) where
import qualified Data.Binary.Get as Bin
import qualified Data.Binary.Put as Bin
import GHC.ST (ST, runST)
import Data.Binary (Get, Put)
import Data.Array.ST (MArray, STUArray, newArray, readArray)
import Data.Array.Unsafe (castSTUArray)
-- NB: Once we drop support for binary < 0.8.4 we can use @binary@'s own {get,put}{Double,Float}be operations
putFloat32be :: Float -> Put
putFloat32be x = Bin.putWord32be (runST (cast x))
putFloat64be :: Double -> Put
putFloat64be x = Bin.putWord64be (runST (cast x))
getFloat32be :: Get Float
getFloat32be = do
x <- Bin.getWord32be
return (runST (cast x))
getFloat64be :: Get Double
getFloat64be = do
x <- Bin.getWord64be
return (runST (cast x))
-- See https://stackoverflow.com/questions/6976684/converting-ieee-754-floating-point-in-haskell-word32-64-to-and-from-haskell-floa/7002812#7002812
{-# INLINE cast #-}
cast :: (MArray (STUArray s) a (ST s), MArray (STUArray s) b (ST s)) => a -> ST s b
cast x = newArray (0 :: Int, 0) x >>= castSTUArray >>= flip readArray 0