module Foreign.ForeignPtrWrap where import Foreign.Ptr import Foreign.ForeignPtr import System.IO.Error -- | A wrapper for newForeignPtr that handles nullPtrs, and can be chained to an IO Ptr creator. -- -- Example usage: -- -- > myPtrCreator = (createForeignPtr deallocFunc) . allocFunc -- -- where, allocFunc :: a->b->c->...-> IO (Ptr z) createForeignPtr :: (FunPtr (Ptr a -> IO () )) -> IO (Ptr a) -> IO (ForeignPtr a) createForeignPtr dealloc allocedPtr = do ptr <- checkPtr allocedPtr newForeignPtr dealloc ptr -- | Fails if the ptr is nullPtr checkPtr :: IO (Ptr a) -> IO (Ptr a) checkPtr x = do res <- x if res /= nullPtr then return res else fail "Null Pointer" ------------------------------------------------ -- | Names a failure errorName :: String -> IO a -> IO a errorName = modifyIOError . const . userError