module Sound.ALSA.PCM.Core.Convert where

import qualified Foreign.Marshal.Utils as U
import qualified Foreign.Storable as St
import Foreign.Ptr (Ptr, )

import qualified Prelude as P
import Prelude hiding (id, )


data T h c =
        Cons {fromHaskell :: h -> c, toHaskell :: c -> h}

with ::
   (St.Storable c) =>
   T h c -> h -> (Ptr c -> IO a) -> IO a
with conv a = U.with (fromHaskell conv a)

peek ::
   (St.Storable a) =>
   T h a -> Ptr a -> IO h
peek conv aptr = fmap (toHaskell conv) $ St.peek aptr


id :: T a a
id = Cons P.id P.id

int :: (Integral a, Integral b) => T a b
int = Cons fromIntegral fromIntegral

{-
word :: T Word C.CUInt
word = Cons fromIntegral fromIntegral
-}