module Data.Packer.IEEE754 (
wordToDouble
, wordToFloat
, doubleToWord
, floatToWord
) where
import Control.Monad.ST (runST, ST)
import Data.Word (Word32, Word64)
import GHC.Prim
import GHC.Float
import GHC.Word
import GHC.ST
wordToFloat :: Word32 -> Float
wordToFloat (W32# x) = runST $ ST $ \s1 ->
case newByteArray# 4# s1 of
(# s2, mbarr #) ->
let !s3 = writeWord32Array# mbarr 0# x s2
in case readFloatArray# mbarr 0# s3 of
(# s4, f #) -> (# s4, F# f #)
floatToWord :: Float -> Word32
floatToWord (F# x) = runST $ ST $ \s1 ->
case newByteArray# 4# s1 of
(# s2, mbarr #) ->
let !s3 = writeFloatArray# mbarr 0# x s2
in case readWord32Array# mbarr 0# s3 of
(# s4, w #) -> (# s4, W32# w #)
wordToDouble :: Word64 -> Double
wordToDouble (W64# x) = runST $ ST $ \s1 ->
case newByteArray# 8# s1 of
(# s2, mbarr #) ->
let !s3 = writeWord64Array# mbarr 0# x s2
in case readDoubleArray# mbarr 0# s3 of
(# s4, f #) -> (# s4, D# f #)
doubleToWord :: Double -> Word64
doubleToWord (D# x) = runST $ ST $ \s1 ->
case newByteArray# 8# s1 of
(# s2, mbarr #) ->
let !s3 = writeDoubleArray# mbarr 0# x s2
in case readWord64Array# mbarr 0# s3 of
(# s4, w #) -> (# s4, W64# w #)