packages feed

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