lhc-0.6.20081210.1: lib/base/src/Foreign/ForeignPtr.hs
-- | Just a dummy skeleton, fixme.
module Foreign.ForeignPtr
(ForeignPtr, newForeignPtr_, newForeignPtr,
addForeignPtrFinalizer, mallocForeignPtr, mallocForeignPtrBytes,
withForeignPtr, unsafeForeignPtrToPtr, touchForeignPtr, castForeignPtr
) where
import Control.Monad
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable
newtype ForeignPtr a = FP (Ptr a)
type FinalizerPtr a = Ptr a
newForeignPtr_ :: Ptr a -> IO (ForeignPtr a)
newForeignPtr_ = return . FP
newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr finalizer ptr = do
fp <- newForeignPtr_ ptr
addForeignPtrFinalizer finalizer fp
return fp
-- newForeignPtrEnv :: FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO (ForeignPtr a)
addForeignPtrFinalizer :: FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer _ _ = return ()
-- addForeignPtrFinalizerEnv :: FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> IO ()
mallocForeignPtr :: Storable a => IO (ForeignPtr a)
mallocForeignPtr = liftM FP malloc
mallocForeignPtrBytes :: Int -> IO (ForeignPtr a)
mallocForeignPtrBytes = liftM FP . mallocBytes
mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArray = liftM FP . mallocArray
-- mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a)
-- mallocForeignPtrArray0 = liftM FP . mallocArray0
withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr (FP p) act = act p
unsafeForeignPtrToPtr :: ForeignPtr a -> Ptr a
unsafeForeignPtrToPtr (FP x) = x
touchForeignPtr :: ForeignPtr a -> IO ()
touchForeignPtr _ = return ()
castForeignPtr :: ForeignPtr a -> ForeignPtr b
castForeignPtr (FP x) = FP $ castPtr x