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 :: Peek Int32
peekInt32 ByteString
xs = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peek PTR
peekWord32 ByteString
xs
peekInt16 :: Peek Int16; peekInt16 :: Peek Int16
peekInt16 ByteString
xs = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peek Word16
peekWord16 ByteString
xs
peekInt8  :: Peek Int8;  peekInt8 :: Peek Int8
peekInt8  ByteString
xs = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peek Word8
peekWord8  ByteString
xs

peekWord32 :: Peek Word32
peekWord32 :: Peek PTR
peekWord32 ByteString
xs PTR
ptr =
  let k :: Int
k = forall a b. (Integral a, Num b) => a -> b
fromIntegral PTR
ptr
  in  forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
0 forall a. Bits a => a -> a -> a
<+ forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
1 forall a. Bits a => a -> a -> a
<+
      forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
2 forall a. Bits a => a -> a -> a
<+ forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
3

peekWord16 :: Peek Word16
peekWord16 :: Peek Word16
peekWord16 ByteString
xs PTR
ptr =
  let k :: Int
k = forall a b. (Integral a, Num b) => a -> b
fromIntegral PTR
ptr
  in  forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
0 forall a. Bits a => a -> a -> a
<+ forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
1

infixl 6 <+
(<+) :: (Bits a) => a -> a -> a
a
x <+ :: forall a. Bits a => a -> a -> a
<+ a
y = forall a. Bits a => a -> Int -> a
shiftL a
x Int
8 forall a. Bits a => a -> a -> a
.|. a
y

peekOffset :: (Bits a, Num a) => B.ByteString -> Int -> Int -> a
peekOffset :: forall a. (Bits a, Num a) => ByteString -> Int -> Int -> a
peekOffset ByteString
xs Int
k Int
d = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ HasCallStack => ByteString -> Int -> Word8
B.index ByteString
xs forall a b. (a -> b) -> a -> b
$ Int
kforall a. Num a => a -> a -> a
+Int
d

peekWord8 :: Peek Word8
peekWord8 :: Peek Word8
peekWord8 ByteString
xs PTR
k = HasCallStack => ByteString -> Int -> Word8
B.index ByteString
xs forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral PTR
k