#if !(MIN_VERSION_base(4,11,0))
#endif
module Data.Binary.FloatCast
( floatToWord
, wordToFloat
, doubleToWord
, wordToDouble
) where
#if MIN_VERSION_base(4,11,0)
import Data.Word (Word32, Word64)
import GHC.Float (castWord32ToFloat, castFloatToWord32, castWord64ToDouble, castDoubleToWord64)
floatToWord :: Float -> Word32
floatToWord = castFloatToWord32
wordToFloat :: Word32 -> Float
wordToFloat = castWord32ToFloat
doubleToWord :: Double -> Word64
doubleToWord = castDoubleToWord64
wordToDouble :: Word64 -> Double
wordToDouble = castWord64ToDouble
#else
import Data.Word (Word32, Word64)
import Data.Array.ST (newArray, readArray, MArray, STUArray)
import Data.Array.Unsafe (castSTUArray)
import GHC.ST (runST, ST)
floatToWord :: Float -> Word32
floatToWord x = runST (cast x)
wordToFloat :: Word32 -> Float
wordToFloat x = runST (cast x)
doubleToWord :: Double -> Word64
doubleToWord x = runST (cast x)
wordToDouble :: Word64 -> Double
wordToDouble x = runST (cast x)
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
#endif