module Sound.MED.Basic.ByteString where import qualified Data.ByteString as B import Data.Bits (Bits, shiftL, (.|.)) import Data.Word (Word8, Word16, Word32) import Data.Int (Int8, Int16, Int32) type PTR = Word32 type Peek a = B.ByteString -> PTR -> a peekInt32 :: Peek Int32; peekInt32 xs = fromIntegral . peekWord32 xs peekInt16 :: Peek Int16; peekInt16 xs = fromIntegral . peekWord16 xs peekInt8 :: Peek Int8; peekInt8 xs = fromIntegral . peekWord8 xs peekWord32 :: Peek Word32 peekWord32 xs ptr = let k = fromIntegral ptr in peekOffset xs k 0 <+ peekOffset xs k 1 <+ peekOffset xs k 2 <+ peekOffset xs k 3 peekWord16 :: Peek Word16 peekWord16 xs ptr = let k = fromIntegral ptr in peekOffset xs k 0 <+ peekOffset xs k 1 infixl 6 <+ (<+) :: (Bits a) => a -> a -> a x <+ y = shiftL x 8 .|. y peekOffset :: (Bits a, Num a) => B.ByteString -> Int -> Int -> a peekOffset xs k d = fromIntegral $ B.index xs $ k+d peekWord8 :: Peek Word8 peekWord8 xs k = B.index xs $ fromIntegral k