{- |
Storable instances for simple wrapped types.

Example:

> import Foreign.Storable.Newtype as Store
>
> newtype MuLaw = MuLaw {deMuLaw :: Word8}
>
> instance Storable MuLaw where
>    sizeOf = Store.sizeOf deMuLaw
>    alignment = Store.alignment deMuLaw
>    peek = Store.peek MuLaw
>    poke = Store.poke deMuLaw
-}
module Foreign.Storable.Newtype where

import Foreign.Ptr (Ptr, castPtr, )
import Foreign.Storable (Storable, )
import qualified Foreign.Storable as Store


sizeOf :: Storable core => (wrapper -> core) -> wrapper -> Int
sizeOf unwrap = Store.sizeOf . unwrap

alignment :: Storable core => (wrapper -> core) -> wrapper -> Int
alignment unwrap = Store.alignment . unwrap


peek :: Storable core =>
   (core -> wrapper) -> Ptr wrapper -> IO wrapper
peek wrap =
   fmap wrap . Store.peek . castPtr

poke :: Storable core =>
   (wrapper -> core) -> Ptr wrapper -> wrapper -> IO ()
poke unwrap ptr =
   Store.poke (castPtr ptr) . unwrap