module Data.BBI.Utils
( Endianness(..)
, hReadBool
, readInt64
, hReadInt64
, readInt32
, hReadInt32
, readInt16
, hReadInt16
, readInt8
, hReadInt8
, readFloat32
, fromRight
) where
import qualified Data.ByteString as B
import Data.Serialize
import System.IO
data Endianness = LE
| BE
deriving (Show)
hReadBool :: Handle -> IO Bool
hReadBool h = do
bs <- B.hGet h 1
return . fromRight . runGet (fmap (toEnum . fromIntegral) getWord8) $ bs
readInt64 :: Endianness -> B.ByteString -> Int
readInt64 LE = fromIntegral . fromRight . runGet getWord64le
readInt64 BE = fromIntegral . fromRight . runGet getWord64be
hReadInt64 :: Endianness -> Handle -> IO Int
hReadInt64 e h = fmap (readInt64 e) . B.hGet h $ 8
readInt32 :: Endianness -> B.ByteString -> Int
readInt32 LE = fromIntegral . fromRight . runGet getWord32le
readInt32 BE = fromIntegral . fromRight . runGet getWord32be
hReadInt32 :: Endianness -> Handle -> IO Int
hReadInt32 e h = fmap (readInt32 e) . B.hGet h $ 4
readInt16 :: Endianness -> B.ByteString -> Int
readInt16 LE = fromIntegral . fromRight . runGet getWord16le
readInt16 BE = fromIntegral . fromRight . runGet getWord16be
hReadInt16 :: Endianness -> Handle -> IO Int
hReadInt16 e h = fmap (readInt16 e) . B.hGet h $ 2
hReadInt8 :: Handle -> IO Int
hReadInt8 h = fmap readInt8 . B.hGet h $ 1
readInt8 :: B.ByteString -> Int
readInt8 = fromIntegral . fromRight . runGet getWord8
readFloat32 :: Endianness -> B.ByteString -> Float
readFloat32 LE = fromRight . runGet getFloat32le
readFloat32 BE = fromRight . runGet getFloat32be
fromRight :: Either String b -> b
fromRight (Right x) = x
fromRight (Left s) = error s