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. -- 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 checkPtr :: IO (Ptr a) -> IO (Ptr a) checkPtr x = do res <- x if res /= nullPtr then return res else fail "Null Pointer" ------------------------------------------------ errorName :: String -> IO a -> IO a errorName = modifyIOError . const . userError