{-# LANGUAGE UnicodeSyntax, NoImplicitPrelude #-}
-------------------------------------------------------------------------------
-- |
-- Module : Foreign.Storable.Region
-- Copyright : (c) 2010 Bas van Dijk
-- License : BSD3 (see the file LICENSE)
-- Maintainer : Bas van Dijk <v.dijk.bas@gmail.com>
--
-- Lifts methods of the 'Storable' type class from @Foreign.Storable@ to
-- regional pointers.
--
-------------------------------------------------------------------------------
module Foreign.Storable.Region
( peekElemOff, pokeElemOff
, peekByteOff, pokeByteOff
, peek, poke
) where
--------------------------------------------------------------------------------
-- Imports
--------------------------------------------------------------------------------
-- from base:
import Data.Int ( Int )
import Foreign.Storable ( Storable )
import qualified Foreign.Storable as FS ( peekElemOff, pokeElemOff
, peekByteOff, pokeByteOff
, peek, poke
)
-- from transformers:
import Control.Monad.Trans ( MonadIO )
-- from regions:
import Control.Monad.Trans.Region ( ParentOf )
-- from ourselves:
import Foreign.Ptr.Region ( RegionalPtr )
import Foreign.Ptr.Region.Unsafe ( unsafeWrap, unsafeWrap2, unsafeWrap3 )
--------------------------------------------------------------------------------
-- Storable methods lifted to a region
--------------------------------------------------------------------------------
-- | Wraps: @Foreign.Storable.'FS.peekElemOff'@.
peekElemOff ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr α pr → Int → cr α
peekElemOff = unsafeWrap2 FS.peekElemOff
-- | Wraps: @Foreign.Storable.'FS.pokeElemOff'@.
pokeElemOff ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr α pr → Int → α → cr ()
pokeElemOff = unsafeWrap3 FS.pokeElemOff
-- | Wraps: @Foreign.Storable.'FS.peekByteOff'@.
peekByteOff ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr β pr → Int → cr α
peekByteOff = unsafeWrap2 FS.peekByteOff
-- | Wraps: @Foreign.Storable.'FS.pokeByteOff'@.
pokeByteOff ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr β pr → Int → α → cr ()
pokeByteOff = unsafeWrap3 FS.pokeByteOff
-- | Wraps: @Foreign.Storable.'FS.peek'@.
peek ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr α pr → cr α
peek = unsafeWrap FS.peek
-- | Wraps: @Foreign.Storable.'FS.poke'@.
poke ∷ (pr `ParentOf` cr, Storable α, MonadIO cr)
⇒ RegionalPtr α pr → α → cr ()
poke = unsafeWrap2 FS.poke
-- The End ---------------------------------------------------------------------