module Data.Serialize.IEEE754 (
getFloat32be
, getFloat64be
, getFloat32le
, getFloat64le
, getFloat32host
, getFloat64host
, putFloat32le
, putFloat64le
, putFloat32be
, putFloat64be
, putFloat32host
, putFloat64host
, floatToWord
, wordToFloat
, doubleToWord
, wordToDouble
) where
import Control.Applicative ((<$>))
import Data.Array.ST (newArray, castSTUArray, readArray, MArray, STUArray)
import Data.Serialize
import Data.Word (Word32, Word64)
import GHC.ST (runST, ST)
getFloat32le :: Get Float
getFloat32le = wordToFloat <$> getWord32le
getFloat64le :: Get Double
getFloat64le = wordToDouble <$> getWord64le
getFloat32be :: Get Float
getFloat32be = wordToFloat <$> getWord32be
getFloat64be :: Get Double
getFloat64be = wordToDouble <$> getWord64be
getFloat32host :: Get Float
getFloat32host = wordToFloat <$> getWord32host
getFloat64host :: Get Double
getFloat64host = wordToDouble <$> getWord64host
putFloat32le :: Putter Float
putFloat32le = putWord32le . floatToWord
putFloat64le :: Putter Double
putFloat64le = putWord64le . doubleToWord
putFloat32be :: Putter Float
putFloat32be = putWord32be . floatToWord
putFloat64be :: Putter Double
putFloat64be = putWord64be . doubleToWord
putFloat32host :: Putter Float
putFloat32host = putWord32host . floatToWord
putFloat64host :: Putter Double
putFloat64host = putWord64host . doubleToWord
wordToFloat :: Word32 -> Float
wordToFloat x = runST (cast x)
floatToWord :: Float -> Word32
floatToWord x = runST (cast x)
wordToDouble :: Word64 -> Double
wordToDouble x = runST (cast x)
doubleToWord :: Double -> Word64
doubleToWord 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