{-# LANGUAGE CPP #-}
-- | Unlifted "Foreign".
--
-- @since 0.2.5.0

module UnliftIO.Foreign (
  -- * Re-exported modules
    module Data.Bits
  , module Data.Int
  , module Data.Word
  , module Foreign.C.Types

  -- * Unlifted "Foreign.C.String"
  , CString
  , CStringLen
  , peekCString
  , peekCStringLen
  , newCString
  , newCStringLen
  , withCString
  , withCStringLen
  , charIsRepresentable
  , castCharToCChar
  , castCCharToChar
  , castCharToCUChar
  , castCUCharToChar
  , castCharToCSChar
  , castCSCharToChar
  , peekCAString
  , peekCAStringLen
  , newCAString
  , newCAStringLen
  , withCAString
  , withCAStringLen
  , CWString
  , CWStringLen
  , peekCWString
  , peekCWStringLen
  , newCWString
  , newCWStringLen
  , withCWString
  , withCWStringLen

  -- * Unlifted "Foreign.C.Error"
  , Errno(..)
  , eOK
  , e2BIG
  , eACCES
  , eADDRINUSE
  , eADDRNOTAVAIL
  , eADV
  , eAFNOSUPPORT
  , eAGAIN
  , eALREADY
  , eBADF
  , eBADMSG
  , eBADRPC
  , eBUSY
  , eCHILD
  , eCOMM
  , eCONNABORTED
  , eCONNREFUSED
  , eCONNRESET
  , eDEADLK
  , eDESTADDRREQ
  , eDIRTY
  , eDOM
  , eDQUOT
  , eEXIST
  , eFAULT
  , eFBIG
  , eFTYPE
  , eHOSTDOWN
  , eHOSTUNREACH
  , eIDRM
  , eILSEQ
  , eINPROGRESS
  , eINTR
  , eINVAL
  , eIO
  , eISCONN
  , eISDIR
  , eLOOP
  , eMFILE
  , eMLINK
  , eMSGSIZE
  , eMULTIHOP
  , eNAMETOOLONG
  , eNETDOWN
  , eNETRESET
  , eNETUNREACH
  , eNFILE
  , eNOBUFS
  , eNODATA
  , eNODEV
  , eNOENT
  , eNOEXEC
  , eNOLCK
  , eNOLINK
  , eNOMEM
  , eNOMSG
  , eNONET
  , eNOPROTOOPT
  , eNOSPC
  , eNOSR
  , eNOSTR
  , eNOSYS
  , eNOTBLK
  , eNOTCONN
  , eNOTDIR
  , eNOTEMPTY
  , eNOTSOCK
  , eNOTSUP
  , eNOTTY
  , eNXIO
  , eOPNOTSUPP
  , ePERM
  , ePFNOSUPPORT
  , ePIPE
  , ePROCLIM
  , ePROCUNAVAIL
  , ePROGMISMATCH
  , ePROGUNAVAIL
  , ePROTO
  , ePROTONOSUPPORT
  , ePROTOTYPE
  , eRANGE
  , eREMCHG
  , eREMOTE
  , eROFS
  , eRPCMISMATCH
  , eRREMOTE
  , eSHUTDOWN
  , eSOCKTNOSUPPORT
  , eSPIPE
  , eSRCH
  , eSRMNT
  , eSTALE
  , eTIME
  , eTIMEDOUT
  , eTOOMANYREFS
  , eTXTBSY
  , eUSERS
  , eWOULDBLOCK
  , eXDEV
  , isValidErrno
  , getErrno
  , resetErrno
  , errnoToIOError
  , throwErrno
  , throwErrnoIf
  , throwErrnoIf_
  , throwErrnoIfRetry
  , throwErrnoIfRetry_
  , throwErrnoIfMinus1
  , throwErrnoIfMinus1_
  , throwErrnoIfMinus1Retry
  , throwErrnoIfMinus1Retry_
  , throwErrnoIfNull
  , throwErrnoIfNullRetry
  , throwErrnoIfRetryMayBlock
  , throwErrnoIfRetryMayBlock_
  , throwErrnoIfMinus1RetryMayBlock
  , throwErrnoIfMinus1RetryMayBlock_
  , throwErrnoIfNullRetryMayBlock
  , throwErrnoPath
  , throwErrnoPathIf
  , throwErrnoPathIf_
  , throwErrnoPathIfNull
  , throwErrnoPathIfMinus1
  , throwErrnoPathIfMinus1_

  -- * Unlifted "Foreign.Ptr"
  , Ptr
  , nullPtr
  , castPtr
  , plusPtr
  , alignPtr
  , minusPtr
  , FunPtr
  , nullFunPtr
  , castFunPtr
  , castFunPtrToPtr
  , castPtrToFunPtr
  , freeHaskellFunPtr
  , IntPtr(..)
  , ptrToIntPtr
  , intPtrToPtr
  , WordPtr(..)
  , ptrToWordPtr
  , wordPtrToPtr

  -- * Unlifted "Foreign.ForeignPtr"
  , ForeignPtr
  , FinalizerPtr
  , FinalizerEnvPtr
  , newForeignPtr
  , newForeignPtr_
  , addForeignPtrFinalizer
  , newForeignPtrEnv
  , addForeignPtrFinalizerEnv
  , withForeignPtr
  , finalizeForeignPtr
  , touchForeignPtr
  , castForeignPtr
#if MIN_VERSION_base(4,10,0)
  , plusForeignPtr
#endif
  , mallocForeignPtr
  , mallocForeignPtrBytes
  , mallocForeignPtrArray
  , mallocForeignPtrArray0
  , newGHCForeignPtr
  , addGHCForeignPtrFinalizer
  , unsafeForeignPtrToPtr

  -- * Unlifted "Foreign.StablePtr"
  , StablePtr
  , newStablePtr
  , deRefStablePtr
  , freeStablePtr
  , castStablePtrToPtr
  , castPtrToStablePtr

  -- * Unlifted "Foreign.Storable"
  , Storable(..)

  -- * Unlifted "Foreign.Marshal.Alloc"
  , alloca
  , allocaBytes
  , allocaBytesAligned
  , malloc
  , mallocBytes
#if MIN_VERSION_base(4,8,0)
  , calloc
  , callocBytes
#endif
  , realloc
  , reallocBytes
  , free
  , finalizerFree

  -- * Unlifted "Foreign.Marshal.Array"
  , mallocArray
  , mallocArray0
  , allocaArray
  , allocaArray0
  , reallocArray
  , reallocArray0
#if MIN_VERSION_base(4,8,0)
  , callocArray
  , callocArray0
#endif
  , peekArray
  , peekArray0
  , pokeArray
  , pokeArray0
  , newArray
  , newArray0
  , withArray
  , withArray0
  , withArrayLen
  , withArrayLen0
  , copyArray
  , moveArray
  , lengthArray0
  , advancePtr

  -- * Unlifted "Foreign.Marshal.Error"
  , throwIf
  , throwIf_
  , throwIfNeg
  , throwIfNeg_
  , throwIfNull

  -- * Unlifted "Foreign.Marshal.Pool"
  , Pool
  , newPool
  , freePool
  , withPool
  , pooledMalloc
  , pooledMallocBytes
  , pooledRealloc
  , pooledReallocBytes
  , pooledMallocArray
  , pooledMallocArray0
  , pooledReallocArray
  , pooledReallocArray0
  , pooledNew
  , pooledNewArray
  , pooledNewArray0

  -- * Unlifted "Foreign.Marshal.Utils"
  , with
  , new
  , fromBool
  , toBool
  , maybeNew
  , maybeWith
  , maybePeek
  , withMany
  , copyBytes
  , moveBytes
#if MIN_VERSION_base(4,8,0)
  , fillBytes
#endif
  ) where

import Control.Monad.IO.Unlift
import Data.Bits
import Data.Int
import Data.Word
import qualified Foreign as F
import Foreign
  ( FinalizerEnvPtr
  , FinalizerPtr
  , ForeignPtr
  , FunPtr
  , IntPtr(..)
  , Pool
  , Ptr
  , StablePtr
  , Storable(..)
  , WordPtr(..)
  , advancePtr
  , alignPtr
  , castForeignPtr
  , castFunPtr
  , castFunPtrToPtr
  , castPtr
  , castPtrToFunPtr
  , castPtrToStablePtr
  , castStablePtrToPtr
  , finalizerFree
  , fromBool
  , intPtrToPtr
  , minusPtr
  , nullFunPtr
  , nullPtr
#if MIN_VERSION_base(4,10,0)
  , plusForeignPtr
#endif
  , plusPtr
  , ptrToIntPtr
  , ptrToWordPtr
  , toBool
  , withMany
  , wordPtrToPtr
  )

import qualified Foreign.C as F
import Foreign.C
  ( CString
  , CStringLen
  , CWString
  , CWStringLen
  , Errno(..)
  , castCCharToChar
  , castCSCharToChar
  , castCUCharToChar
  , castCharToCChar
  , castCharToCSChar
  , castCharToCSChar
  , castCharToCUChar
  , charIsRepresentable
  , e2BIG
  , eACCES
  , eADDRINUSE
  , eADDRNOTAVAIL
  , eADV
  , eAFNOSUPPORT
  , eAGAIN
  , eALREADY
  , eBADF
  , eBADMSG
  , eBADRPC
  , eBUSY
  , eCHILD
  , eCOMM
  , eCONNABORTED
  , eCONNREFUSED
  , eCONNRESET
  , eDEADLK
  , eDESTADDRREQ
  , eDIRTY
  , eDOM
  , eDQUOT
  , eEXIST
  , eFAULT
  , eFBIG
  , eFTYPE
  , eHOSTDOWN
  , eHOSTUNREACH
  , eIDRM
  , eILSEQ
  , eINPROGRESS
  , eINTR
  , eINVAL
  , eIO
  , eISCONN
  , eISDIR
  , eLOOP
  , eMFILE
  , eMLINK
  , eMSGSIZE
  , eMULTIHOP
  , eNAMETOOLONG
  , eNETDOWN
  , eNETRESET
  , eNETUNREACH
  , eNFILE
  , eNOBUFS
  , eNODATA
  , eNODEV
  , eNOENT
  , eNOEXEC
  , eNOLCK
  , eNOLINK
  , eNOMEM
  , eNOMSG
  , eNONET
  , eNOPROTOOPT
  , eNOSPC
  , eNOSR
  , eNOSTR
  , eNOSYS
  , eNOTBLK
  , eNOTCONN
  , eNOTDIR
  , eNOTEMPTY
  , eNOTSOCK
  , eNOTSUP
  , eNOTTY
  , eNXIO
  , eOK
  , eOPNOTSUPP
  , ePERM
  , ePFNOSUPPORT
  , ePIPE
  , ePROCLIM
  , ePROCUNAVAIL
  , ePROGMISMATCH
  , ePROGUNAVAIL
  , ePROTO
  , ePROTONOSUPPORT
  , ePROTOTYPE
  , eRANGE
  , eREMCHG
  , eREMOTE
  , eROFS
  , eRPCMISMATCH
  , eRREMOTE
  , eSHUTDOWN
  , eSOCKTNOSUPPORT
  , eSPIPE
  , eSRCH
  , eSRMNT
  , eSTALE
  , eTIME
  , eTIMEDOUT
  , eTOOMANYREFS
  , eTXTBSY
  , eUSERS
  , eWOULDBLOCK
  , eXDEV
  , errnoToIOError
  , isValidErrno
  )
import Foreign.C.Types
import qualified Foreign.Concurrent as FC
import Foreign.ForeignPtr.Unsafe

-- | Lifted 'F.peekCString'.
--
-- @since 0.2.5.0
{-# INLINE peekCString #-}
peekCString :: MonadIO m => CString -> m String
peekCString = liftIO . F.peekCString

-- | Lifted 'F.peekCStringLen'.
--
-- @since 0.2.5.0
{-# INLINE peekCStringLen #-}
peekCStringLen :: MonadIO m => CStringLen -> m String
peekCStringLen = liftIO . F.peekCStringLen

-- | Lifted 'F.newCString'.
--
-- @since 0.2.5.0
{-# INLINE newCString #-}
newCString :: MonadIO m => String -> m CString
newCString = liftIO . F.newCString

-- | Lifted 'F.newCStringLen'.
--
-- @since 0.2.5.0
{-# INLINE newCStringLen #-}
newCStringLen :: MonadIO m => String -> m CStringLen
newCStringLen = liftIO . F.newCStringLen

-- | Unlifted 'F.withCString'.
--
-- @since 0.2.5.0
{-# INLINE withCString #-}
withCString :: MonadUnliftIO m => String -> (CString -> m a) -> m a
withCString s f = withRunInIO (\u -> F.withCString s (u . f))

-- | Unlifted 'F.withCStringLen'.
--
-- @since 0.2.5.0
{-# INLINE withCStringLen #-}
withCStringLen :: MonadUnliftIO m => String -> (CStringLen -> m a) -> m a
withCStringLen s f = withRunInIO (\u -> F.withCStringLen s (u . f))

-- | Lifted 'F.peekCAString'.
--
-- @since 0.2.5.0
{-# INLINE peekCAString #-}
peekCAString :: MonadIO m => CString -> m String
peekCAString = liftIO . F.peekCAString

-- | Lifted 'F.peekCAStringLen'.
--
-- @since 0.2.5.0
{-# INLINE peekCAStringLen #-}
peekCAStringLen :: MonadIO m => CStringLen -> m String
peekCAStringLen = liftIO . F.peekCAStringLen

-- | Lifted 'F.newCAString'.
--
-- @since 0.2.5.0
{-# INLINE newCAString #-}
newCAString :: MonadIO m => String -> m CString
newCAString = liftIO . F.newCAString

-- | Lifted 'F.newCAStringLen'.
--
-- @since 0.2.5.0
{-# INLINE newCAStringLen #-}
newCAStringLen :: MonadIO m => String -> m CStringLen
newCAStringLen = liftIO . F.newCAStringLen

-- | Unlifted 'F.withCAString'.
--
-- @since 0.2.5.0
{-# INLINE withCAString #-}
withCAString :: MonadUnliftIO m => String -> (CString -> m a) -> m a
withCAString str f = withRunInIO (\u -> F.withCAString str (u . f))

-- | Unlifted 'F.withCAStringLen'.
--
-- @since 0.2.5.0
{-# INLINE withCAStringLen #-}
withCAStringLen :: MonadUnliftIO m => String -> (CStringLen -> m a) -> m a
withCAStringLen str f = withRunInIO (\u -> F.withCAStringLen str (u . f))

-- | Lifted 'F.peekCWString'.
--
-- @since 0.2.5.0
{-# INLINE peekCWString #-}
peekCWString :: MonadIO m => CWString -> m String
peekCWString = liftIO . F.peekCWString

-- | Lifted 'F.peekCWStringLen'.
--
-- @since 0.2.5.0
{-# INLINE peekCWStringLen #-}
peekCWStringLen :: MonadIO m => CWStringLen -> m String
peekCWStringLen = liftIO . F.peekCWStringLen

-- | Lifted 'F.newCWString'.
--
-- @since 0.2.5.0
{-# INLINE newCWString #-}
newCWString :: MonadIO m => String -> m CWString
newCWString = liftIO . F.newCWString

-- | Lifted 'F.newCWStringLen'.
--
-- @since 0.2.5.0
{-# INLINE newCWStringLen #-}
newCWStringLen :: MonadIO m => String -> m CWStringLen
newCWStringLen = liftIO . F.newCWStringLen

-- | Unlifted 'F.withCWString'.
--
-- @since 0.2.5.0
{-# INLINE withCWString #-}
withCWString :: MonadUnliftIO m => String -> (CWString -> m a) -> m a
withCWString str f = withRunInIO (\u -> F.withCWString str (u . f))

-- | Unlifted 'F.withCWStringLen'.
--
-- @since 0.2.5.0
{-# INLINE withCWStringLen #-}
withCWStringLen :: MonadUnliftIO m => String -> (CWStringLen -> m a) -> m a
withCWStringLen str f = withRunInIO (\u -> F.withCWStringLen str (u . f))

-- | Lifted 'F.getErrno'.
--
-- @since 0.2.5.0
{-# INLINE getErrno #-}
getErrno :: MonadIO m => m Errno
getErrno = liftIO F.getErrno

-- | Lifted 'F.resetErrno'.
--
-- @since 0.2.5.0
{-# INLINE resetErrno #-}
resetErrno :: MonadIO m => m ()
resetErrno = liftIO F.resetErrno

-- | Lifted 'F.throwErrno'.
--
-- @since 0.2.5.0
{-# INLINE throwErrno #-}
throwErrno :: MonadIO m => String -> m a
throwErrno = liftIO . F.throwErrno

-- | Unlifted 'F.throwErrnoIf'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIf #-}
throwErrnoIf :: MonadUnliftIO m => (a -> Bool) -> String -> m a -> m a
throwErrnoIf pred_ loc f = withRunInIO (\u -> F.throwErrnoIf pred_ loc (u f))

-- | Unlifted 'F.throwErrnoIf_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIf_ #-}
throwErrnoIf_ :: MonadUnliftIO m => (a -> Bool) -> String -> m a -> m ()
throwErrnoIf_ pred_ loc f = withRunInIO (\u -> F.throwErrnoIf_ pred_ loc (u f))

-- | Unlifted 'F.throwErrnoIfRetry'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfRetry #-}
throwErrnoIfRetry :: MonadUnliftIO m => (a -> Bool) -> String -> m a -> m a
throwErrnoIfRetry pred_ loc f =
  withRunInIO (\u -> F.throwErrnoIfRetry pred_ loc (u f))

-- | Unlifted 'F.throwErrnoIfRetry_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfRetry_ #-}
throwErrnoIfRetry_ :: MonadUnliftIO m => (a -> Bool) -> String -> m a -> m ()
throwErrnoIfRetry_ pred_ loc f =
  withRunInIO (\u -> F.throwErrnoIfRetry_ pred_ loc (u f))

-- | Unlifted 'F.throwErrnoIfMinus1'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1 #-}
throwErrnoIfMinus1 :: (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m a
throwErrnoIfMinus1 loc f = withRunInIO (\u -> F.throwErrnoIfMinus1 loc (u f))

-- | Unlifted 'F.throwErrnoIfMinus1_'
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1_ #-}
throwErrnoIfMinus1_ :: (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m ()
throwErrnoIfMinus1_ loc f = withRunInIO (\u -> F.throwErrnoIfMinus1_ loc (u f))

-- | Unlifted 'F.throwErrnoIfMinus1Retry'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1Retry #-}
throwErrnoIfMinus1Retry ::
     (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m a
throwErrnoIfMinus1Retry loc f =
  withRunInIO (\u -> F.throwErrnoIfMinus1Retry loc (u f))

-- | Unlifted 'F.throwErrnoIfMinus1Retry_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1Retry_ #-}
throwErrnoIfMinus1Retry_ ::
     (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m ()
throwErrnoIfMinus1Retry_ loc f =
  withRunInIO (\u -> F.throwErrnoIfMinus1Retry_ loc (u f))

-- | Unlifted 'F.throwErrnoIfNull'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfNull #-}
throwErrnoIfNull :: MonadUnliftIO m => String -> m (Ptr a) -> m (Ptr a)
throwErrnoIfNull loc f = withRunInIO (\u -> F.throwErrnoIfNull loc (u f))

-- | Unlifted 'F.throwErrnoIfNullRetry'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfNullRetry #-}
throwErrnoIfNullRetry :: MonadUnliftIO m => String -> m (Ptr a) -> m (Ptr a)
throwErrnoIfNullRetry loc f =
  withRunInIO (\u -> F.throwErrnoIfNullRetry loc (u f))

-- | Unlifted 'F.throwErrnoIfRetryMayBlock'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfRetryMayBlock #-}
throwErrnoIfRetryMayBlock ::
     MonadUnliftIO m => (a -> Bool) -> String -> m a -> m b -> m a
throwErrnoIfRetryMayBlock pred_ loc f on_block =
  withRunInIO (\u -> F.throwErrnoIfRetryMayBlock pred_ loc (u f) (u on_block))

-- | Unlifted 'F.throwErrnoIfRetryMayBlock_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfRetryMayBlock_ #-}
throwErrnoIfRetryMayBlock_ ::
     MonadUnliftIO m => (a -> Bool) -> String -> m a -> m b -> m ()
throwErrnoIfRetryMayBlock_ pred_ loc f on_block =
  withRunInIO (\u -> F.throwErrnoIfRetryMayBlock_ pred_ loc (u f) (u on_block))

-- | Unlifted 'F.throwErrnoIfMinus1RetryMayBlock'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1RetryMayBlock #-}
throwErrnoIfMinus1RetryMayBlock ::
     (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m b -> m a
throwErrnoIfMinus1RetryMayBlock loc f on_block =
  withRunInIO (\u -> F.throwErrnoIfMinus1RetryMayBlock loc (u f) (u on_block))

-- | Unlifted 'F.throwErrnoIfMinus1RetryMayBlock_'
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfMinus1RetryMayBlock_ #-}
throwErrnoIfMinus1RetryMayBlock_ ::
     (MonadUnliftIO m, Eq a, Num a) => String -> m a -> m b -> m ()
throwErrnoIfMinus1RetryMayBlock_ loc f on_block =
  withRunInIO (\u -> F.throwErrnoIfMinus1RetryMayBlock_ loc (u f) (u on_block))

-- | Unlifted 'F.throwErrnoIfNullRetryMayBlock'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoIfNullRetryMayBlock #-}
throwErrnoIfNullRetryMayBlock ::
     MonadUnliftIO m => String -> m (Ptr a) -> m b -> m (Ptr a)
throwErrnoIfNullRetryMayBlock loc f on_block =
  withRunInIO (\u -> F.throwErrnoIfNullRetryMayBlock loc (u f) (u on_block))

-- | Lifted 'F.throwErrnoPath'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPath #-}
throwErrnoPath :: MonadIO m => String -> FilePath -> m a
throwErrnoPath loc path = liftIO (F.throwErrnoPath loc path)

-- | Unlifted 'F.throwErrnoPathIf'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPathIf #-}
throwErrnoPathIf ::
     MonadUnliftIO m => (a -> Bool) -> String -> FilePath -> m a -> m a
throwErrnoPathIf pred_ loc path f =
  withRunInIO (\u -> F.throwErrnoPathIf pred_ loc path (u f))

-- | Unlifted 'F.throwErrnoPathIf_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPathIf_ #-}
throwErrnoPathIf_ ::
     MonadUnliftIO m => (a -> Bool) -> String -> FilePath -> m a -> m ()
throwErrnoPathIf_ pred_ loc path f =
  withRunInIO (\u -> F.throwErrnoPathIf_ pred_ loc path (u f))

-- | Unlifted 'F.throwErrnoPathIfNull'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPathIfNull #-}
throwErrnoPathIfNull ::
     MonadUnliftIO m => String -> FilePath -> m (Ptr a) -> m (Ptr a)
throwErrnoPathIfNull loc path f =
  withRunInIO (\u -> F.throwErrnoPathIfNull loc path (u f))

-- | Unlifted 'F.throwErrnoPathIfMinus1'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPathIfMinus1 #-}
throwErrnoPathIfMinus1 ::
     (MonadUnliftIO m, Eq a, Num a) => String -> FilePath -> m a -> m a
throwErrnoPathIfMinus1 loc path f =
  withRunInIO (\u -> F.throwErrnoPathIfMinus1 loc path (u f))

-- | Unlifted 'F.throwErrnoPathIfMinus1_'.
--
-- @since 0.2.5.0
{-# INLINE throwErrnoPathIfMinus1_ #-}
throwErrnoPathIfMinus1_ ::
     (MonadUnliftIO m, Eq a, Num a) => String -> FilePath -> m a -> m ()
throwErrnoPathIfMinus1_ loc path f =
  withRunInIO (\u -> F.throwErrnoPathIfMinus1_ loc path (u f))

-- | Lifted 'F.freeHaskellFunPtr'.
--
-- @since 0.2.5.0
{-# INLINE freeHaskellFunPtr #-}
freeHaskellFunPtr :: MonadIO m => FunPtr a -> m ()
freeHaskellFunPtr = liftIO . F.freeHaskellFunPtr

-- | Lifted 'F.newForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE newForeignPtr #-}
newForeignPtr :: MonadIO m => FinalizerPtr a -> Ptr a -> m (ForeignPtr a)
newForeignPtr finalizer p = liftIO (F.newForeignPtr finalizer p)

-- | Lifted 'F.newForeignPtr_'.
--
-- @since 0.2.5.0
{-# INLINE newForeignPtr_ #-}
newForeignPtr_ :: MonadIO m => Ptr a -> m (ForeignPtr a)
newForeignPtr_ = liftIO . F.newForeignPtr_

-- | Lifted 'F.addForeignPtrFinalizer'.
--
-- @since 0.2.5.0
{-# INLINE addForeignPtrFinalizer #-}
addForeignPtrFinalizer :: MonadIO m => FinalizerPtr a -> ForeignPtr a -> m ()
addForeignPtrFinalizer finalizer_ptr foreign_ptr =
  liftIO (F.addForeignPtrFinalizer finalizer_ptr foreign_ptr)

-- | Lifted 'F.newForeignPtrEnv'.
--
-- @since 0.2.5.0
{-# INLINE newForeignPtrEnv #-}
newForeignPtrEnv ::
     MonadIO m => FinalizerEnvPtr env a -> Ptr env -> Ptr a -> m (ForeignPtr a)
newForeignPtrEnv finalizer env p = liftIO (F.newForeignPtrEnv finalizer env p)

-- | Lifted 'F.addForeignPtrFinalizerEnv'.
--
-- @since 0.2.5.0
{-# INLINE addForeignPtrFinalizerEnv #-}
addForeignPtrFinalizerEnv ::
     MonadIO m => FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> m ()
addForeignPtrFinalizerEnv finalizer env fp =
  liftIO (F.addForeignPtrFinalizerEnv finalizer env fp)

-- | Unlifted 'F.withForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE withForeignPtr #-}
withForeignPtr :: MonadUnliftIO m => ForeignPtr a -> (Ptr a -> m b) -> m b
withForeignPtr fo io = withRunInIO (\u -> F.withForeignPtr fo (u . io))

-- | Lifted 'F.finalizeForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE finalizeForeignPtr #-}
finalizeForeignPtr :: MonadIO m => ForeignPtr a -> m ()
finalizeForeignPtr = liftIO . F.finalizeForeignPtr

-- | Lifted 'F.touchForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE touchForeignPtr #-}
touchForeignPtr :: MonadIO m => ForeignPtr a -> m ()
touchForeignPtr = liftIO . F.touchForeignPtr

-- | Lifted 'F.mallocForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE mallocForeignPtr #-}
mallocForeignPtr :: (MonadIO m, Storable a) => m (ForeignPtr a)
mallocForeignPtr = liftIO F.mallocForeignPtr

-- | Lifted 'F.mallocForeignPtrBytes'.
--
-- @since 0.2.5.0
{-# INLINE mallocForeignPtrBytes #-}
mallocForeignPtrBytes :: MonadIO m => Int -> m (ForeignPtr a)
mallocForeignPtrBytes = liftIO . F.mallocForeignPtrBytes

-- | Lifted 'F.mallocForeignPtrArray'.
--
-- @since 0.2.5.0
{-# INLINE mallocForeignPtrArray #-}
mallocForeignPtrArray :: (MonadIO m, Storable a) => Int -> m (ForeignPtr a)
mallocForeignPtrArray = liftIO . F.mallocForeignPtrArray

-- | Lifted 'F.mallocForeignPtrArray0'.
--
-- @since 0.2.5.0
{-# INLINE mallocForeignPtrArray0 #-}
mallocForeignPtrArray0 :: (MonadIO m, Storable a) => Int -> m (ForeignPtr a)
mallocForeignPtrArray0 = liftIO . F.mallocForeignPtrArray0

-- | Unlifted 'FC.newForeignPtr'.
--
-- @since 0.2.5.0
{-# INLINE newGHCForeignPtr #-}
newGHCForeignPtr :: MonadUnliftIO m => Ptr a -> m () -> m (ForeignPtr a)
newGHCForeignPtr ptr f = withRunInIO (\u -> FC.newForeignPtr ptr (u f))

-- | Unlifted 'FC.addForeignPtrFinalizer'.
--
-- @since 0.2.5.0
{-# INLINE addGHCForeignPtrFinalizer #-}
addGHCForeignPtrFinalizer :: MonadUnliftIO m => ForeignPtr a -> m () -> m ()
addGHCForeignPtrFinalizer fptr f =
  withRunInIO (\u -> FC.addForeignPtrFinalizer fptr (u f))

-- | Lifted 'F.newStablePtr'.
--
-- @since 0.2.5.0
{-# INLINE newStablePtr #-}
newStablePtr :: MonadIO m => a -> m (StablePtr a)
newStablePtr = liftIO . F.newStablePtr

-- | Lifted 'F.deRefStablePtr'.
--
-- @since 0.2.5.0
{-# INLINE deRefStablePtr #-}
deRefStablePtr :: MonadIO m => StablePtr a -> m a
deRefStablePtr = liftIO . F.deRefStablePtr

-- | Lifted 'F.freeStablePtr'.
--
-- @since 0.2.5.0
{-# INLINE freeStablePtr #-}
freeStablePtr :: MonadIO m => StablePtr a -> m ()
freeStablePtr = liftIO . F.freeStablePtr

-- | Unlifted 'F.alloca'.
--
-- @since 0.2.5.0
{-# INLINE alloca #-}
alloca :: (MonadUnliftIO m, Storable a) => (Ptr a -> m b) -> m b
alloca action = withRunInIO (\u -> F.alloca (u . action))

-- | Unlifted 'F.allocaBytes'.
--
-- @since 0.2.5.0
{-# INLINE allocaBytes #-}
allocaBytes :: MonadUnliftIO m => Int -> (Ptr a -> m b) -> m b
allocaBytes size action = withRunInIO (\u -> F.allocaBytes size (u . action))

-- | Unlifted 'F.allocaBytesAligned'.
--
-- @since 0.2.5.0
{-# INLINE allocaBytesAligned #-}
allocaBytesAligned :: MonadUnliftIO m => Int -> Int -> (Ptr a -> m b) -> m b
allocaBytesAligned size align action =
  withRunInIO (\u -> F.allocaBytesAligned size align (u . action))

-- | Lifted 'F.malloc'.
--
-- @since 0.2.5.0
{-# INLINE malloc #-}
malloc :: (MonadIO m, Storable a) => m (Ptr a)
malloc = liftIO F.malloc

-- | Lifted 'F.mallocBytes'.
--
-- @since 0.2.5.0
{-# INLINE mallocBytes #-}
mallocBytes :: MonadIO m => Int -> m (Ptr a)
mallocBytes = liftIO . F.mallocBytes

#if MIN_VERSION_base(4,8,0)
-- | Lifted 'F.calloc'.
--
-- @since 0.2.5.0
{-# INLINE calloc #-}
calloc :: (MonadIO m, Storable a) => m (Ptr a)
calloc = liftIO F.calloc

-- | Lifted 'F.callocBytes'.
--
-- @since 0.2.5.0
{-# INLINE callocBytes #-}
callocBytes :: MonadIO m => Int -> m (Ptr a)
callocBytes = liftIO . F.callocBytes
#endif

-- | Lifted 'F.realloc'.
--
-- @since 0.2.5.0
{-# INLINE realloc #-}
realloc :: (MonadIO m, Storable b) => Ptr a -> m (Ptr b)
realloc = liftIO . F.realloc

-- | Lifted 'F.reallocBytes'.
--
-- @since 0.2.5.0
{-# INLINE reallocBytes #-}
reallocBytes :: MonadIO m => Ptr a -> Int -> m (Ptr a)
reallocBytes ptr size = liftIO (F.reallocBytes ptr size)

-- | Lifted 'F.free'.
--
-- @since 0.2.5.0
{-# INLINE free #-}
free :: MonadIO m => Ptr a -> m ()
free = liftIO . F.free

-- | Lifted 'F.mallocArray'.
--
-- @since 0.2.5.0
{-# INLINE mallocArray #-}
mallocArray :: (MonadIO m, Storable a) => Int -> m (Ptr a)
mallocArray = liftIO . F.mallocArray

-- | Lifted 'F.mallocArray0'.
--
-- @since 0.2.5.0
{-# INLINE mallocArray0 #-}
mallocArray0 :: (MonadIO m, Storable a) => Int -> m (Ptr a)
mallocArray0 = liftIO . F.mallocArray

-- | Unlifted 'F.allocaArray'.
--
-- @since 0.2.5.0
{-# INLINE allocaArray #-}
allocaArray :: (MonadUnliftIO m, Storable a) => Int -> (Ptr a -> m b) -> m b
allocaArray size action = withRunInIO (\u -> F.allocaArray size (u . action))

-- | Unlifted 'F.allocaArray0'.
--
-- @since 0.2.5.0
{-# INLINE allocaArray0 #-}
allocaArray0 :: (MonadUnliftIO m, Storable a) => Int -> (Ptr a -> m b) -> m b
allocaArray0 size action = withRunInIO (\u -> F.allocaArray0 size (u . action))

-- | Lifted 'F.reallocArray'.
--
-- @since 0.2.5.0
{-# INLINE reallocArray #-}
reallocArray :: (MonadIO m, Storable a) => Ptr a -> Int -> m (Ptr a)
reallocArray ptr size = liftIO (F.reallocArray ptr size)

-- | Lifted 'F.reallocArray0'.
--
-- @since 0.2.5.0
{-# INLINE reallocArray0 #-}
reallocArray0 :: (MonadIO m, Storable a) => Ptr a -> Int -> m (Ptr a)
reallocArray0 ptr size = liftIO (F.reallocArray0 ptr size)

#if MIN_VERSION_base(4,8,0)
-- | Lifted 'F.callocArray'.
--
-- @since 0.2.5.0
{-# INLINE callocArray #-}
callocArray :: (MonadIO m, Storable a) => Int -> m (Ptr a)
callocArray = liftIO . F.callocArray

-- | Lifted 'F.callocArray0'.
--
-- @since 0.2.5.0
{-# INLINE callocArray0 #-}
callocArray0 :: (MonadIO m, Storable a) => Int -> m (Ptr a)
callocArray0 = liftIO . F.callocArray0
#endif

-- | Lifted 'F.peekArray'.
--
-- @since 0.2.5.0
{-# INLINE peekArray #-}
peekArray :: (MonadIO m, Storable a) => Int -> Ptr a -> m [a]
peekArray size ptr = liftIO (F.peekArray size ptr)

-- | Lifted 'F.peekArray0'.
--
-- @since 0.2.5.0
{-# INLINE peekArray0 #-}
peekArray0 :: (MonadIO m, Storable a, Eq a) => a -> Ptr a -> m [a]
peekArray0 marker ptr = liftIO (F.peekArray0 marker ptr)

-- | Lifted 'F.pokeArray'.
--
-- @since 0.2.5.0
{-# INLINE pokeArray #-}
pokeArray :: (MonadIO m, Storable a) => Ptr a -> [a] -> m ()
pokeArray ptr vals0 = liftIO (F.pokeArray ptr vals0)

-- | Lifted 'F.pokeArray0'.
--
-- @since 0.2.5.0
{-# INLINE pokeArray0 #-}
pokeArray0 :: (MonadIO m, Storable a) => a -> Ptr a -> [a] -> m ()
pokeArray0 marker ptr vals0 = liftIO (F.pokeArray0 marker ptr vals0)

-- | Lifted 'F.newArray'.
--
-- @since 0.2.5.0
{-# INLINE newArray #-}
newArray :: (MonadIO m, Storable a) => [a] -> m (Ptr a)
newArray = liftIO . F.newArray

-- | Lifted 'F.newArray0'
--
-- @since 0.2.5.0
{-# INLINE newArray0 #-}
newArray0 :: (MonadIO m, Storable a) => a -> [a] -> m (Ptr a)
newArray0 marker vals = liftIO (F.newArray0 marker vals)

-- | Unlifted 'F.withArray'.
--
-- @since 0.2.5.0
{-# INLINE withArray #-}
withArray :: (MonadUnliftIO m, Storable a) => [a] -> (Ptr a -> m b) -> m b
withArray vals action = withRunInIO (\u -> F.withArray vals (u . action))

-- | Unlifted 'F.withArray0'.
--
-- @since 0.2.5.0
{-# INLINE withArray0 #-}
withArray0 :: (MonadUnliftIO m, Storable a) => a -> [a] -> (Ptr a -> m b) -> m b
withArray0 marker vals action =
  withRunInIO (\u -> F.withArray0 marker vals (u . action))

-- | Unlifted 'F.withArrayLen'.
--
-- @since 0.2.5.0
{-# INLINE withArrayLen #-}
withArrayLen ::
     (MonadUnliftIO m, Storable a) => [a] -> (Int -> Ptr a -> m b) -> m b
withArrayLen vals f =
  withRunInIO (\u -> F.withArrayLen vals (\s p -> u (f s p)))

-- | Unlifted 'F.withArrayLen0'.
--
-- @since 0.2.5.0
{-# INLINE withArrayLen0 #-}
withArrayLen0 ::
     (MonadUnliftIO m, Storable a) => a -> [a] -> (Int -> Ptr a -> m b) -> m b
withArrayLen0 marker vals f =
  withRunInIO (\u -> F.withArrayLen0 marker vals (\s p -> u (f s p)))

-- | Lifted 'F.copyArray'.
--
-- @since 0.2.5.0
{-# INLINE copyArray #-}
copyArray :: (MonadIO m, Storable a) => Ptr a -> Ptr a -> Int -> m ()
copyArray dest src size = liftIO (F.copyArray dest src size)

-- | Lifted 'F.moveArray'.
--
-- @since 0.2.5.0
{-# INLINE moveArray #-}
moveArray :: (MonadIO m, Storable a) => Ptr a -> Ptr a -> Int -> m ()
moveArray dest src size = liftIO (F.moveArray dest src size)

-- | Lifted 'F.lengthArray0'.
--
-- @since 0.2.5.0
{-# INLINE lengthArray0 #-}
lengthArray0 :: (MonadIO m, Storable a, Eq a) => a -> Ptr a -> m Int
lengthArray0 marker ptr = liftIO (F.lengthArray0 marker ptr)

-- | Unlifted 'F.throwIf'.
--
-- @since 0.2.5.0
{-# INLINE throwIf #-}
throwIf :: MonadUnliftIO m => (a -> Bool) -> (a -> String) -> m a -> m a
throwIf pred_ msgfct act = withRunInIO (\u -> F.throwIf pred_ msgfct (u act))

-- | Unlifted 'F.throwIf_'.
--
-- @since 0.2.5.0
{-# INLINE throwIf_ #-}
throwIf_ :: MonadUnliftIO m => (a -> Bool) -> (a -> String) -> m a -> m ()
throwIf_ pred_ msgfct act = withRunInIO (\u -> F.throwIf_ pred_ msgfct (u act))

-- | Unlifted 'F.throwIfNeg'.
--
-- @since 0.2.5.0
{-# INLINE throwIfNeg #-}
throwIfNeg :: (MonadUnliftIO m, Ord a, Num a) => (a -> String) -> m a -> m a
throwIfNeg msgfct act = withRunInIO (\u -> F.throwIfNeg msgfct (u act))

-- | Unlifted 'F.throwIfNeg_'.
--
-- @since 0.2.5.0
{-# INLINE throwIfNeg_ #-}
throwIfNeg_ :: (MonadUnliftIO m, Ord a, Num a) => (a -> String) -> m a -> m ()
throwIfNeg_ msgfct act = withRunInIO (\u -> F.throwIfNeg_ msgfct (u act))

-- | Unlifted 'F.throwIfNull'.
--
-- @since 0.2.5.0
{-# INLINE throwIfNull #-}
throwIfNull :: MonadUnliftIO m => String -> m (Ptr a) -> m (Ptr a)
throwIfNull msg act = withRunInIO (\u -> F.throwIfNull msg (u act))

-- | Lifted 'F.newPool'.
--
-- @since 0.2.5.0
{-# INLINE newPool #-}
newPool :: MonadIO m => m Pool
newPool = liftIO F.newPool

-- | Lifted 'F.freePool'.
--
-- @since 0.2.5.0
{-# INLINE freePool #-}
freePool :: MonadIO m => Pool -> m ()
freePool = liftIO . F.freePool

-- | Unlifted 'F.withPool'.
--
-- @since 0.2.5.0
{-# INLINE withPool #-}
withPool :: MonadUnliftIO m => (Pool -> m b) -> m b
withPool act = withRunInIO (\u -> F.withPool (u . act))

-- | Lifted 'F.pooledMalloc'.
--
-- @since 0.2.5.0
{-# INLINE pooledMalloc #-}
pooledMalloc :: (MonadIO m, Storable a) => Pool -> m (Ptr a)
pooledMalloc = liftIO . F.pooledMalloc

-- | Lifted 'F.pooledMallocBytes'.
--
-- @since 0.2.5.0
{-# INLINE pooledMallocBytes #-}
pooledMallocBytes :: MonadIO m => Pool -> Int -> m (Ptr a)
pooledMallocBytes pool size = liftIO (F.pooledMallocBytes pool size)

-- | Lifted 'F.pooledRealloc'.
--
-- @since 0.2.5.0
{-# INLINE pooledRealloc #-}
pooledRealloc :: (MonadIO m, Storable a) => Pool -> Ptr a -> m (Ptr a)
pooledRealloc pool ptr = liftIO (F.pooledRealloc pool ptr)

-- | Lifted 'F.pooledReallocBytes'.
--
-- @since 0.2.5.0
{-# INLINE pooledReallocBytes #-}
pooledReallocBytes :: MonadIO m => Pool -> Ptr a -> Int -> m (Ptr a)
pooledReallocBytes pool ptr size = liftIO (F.pooledReallocBytes pool ptr size)

-- | Lifted 'F.pooledMallocArray'.
--
-- @since 0.2.5.0
{-# INLINE pooledMallocArray #-}
pooledMallocArray :: (MonadIO m, Storable a) => Pool -> Int -> m (Ptr a)
pooledMallocArray pool size = liftIO (F.pooledMallocArray pool size)

-- | Lifted 'F.pooledMallocArray0'.
--
-- @since 0.2.5.0
{-# INLINE pooledMallocArray0 #-}
pooledMallocArray0 :: (MonadIO m, Storable a) => Pool -> Int -> m (Ptr a)
pooledMallocArray0 pool size = liftIO (F.pooledMallocArray0 pool size)

-- | Lifted 'F.pooledReallocArray'.
--
-- @since 0.2.5.0
{-# INLINE pooledReallocArray #-}
pooledReallocArray ::
     (MonadIO m, Storable a) => Pool -> Ptr a -> Int -> m (Ptr a)
pooledReallocArray pool ptr size = liftIO (F.pooledReallocArray pool ptr size)

-- | Lifted 'F.pooledReallocArray0'.
--
-- @since 0.2.5.0
{-# INLINE pooledReallocArray0 #-}
pooledReallocArray0 ::
     (MonadIO m, Storable a) => Pool -> Ptr a -> Int -> m (Ptr a)
pooledReallocArray0 pool ptr size = liftIO (F.pooledReallocArray0 pool ptr size)

-- | Lifted 'F.pooledNew'.
--
-- @since 0.2.5.0
{-# INLINE pooledNew #-}
pooledNew :: (MonadIO m, Storable a) => Pool -> a -> m (Ptr a)
pooledNew pool val = liftIO (F.pooledNew pool val)

-- | Lifted 'F.pooledNewArray'.
--
-- @since 0.2.5.0
{-# INLINE pooledNewArray #-}
pooledNewArray :: (MonadIO m, Storable a) => Pool -> [a] -> m (Ptr a)
pooledNewArray pool vals = liftIO (F.pooledNewArray pool vals)

-- | Lifted 'F.pooledNewArray0'.
--
-- @since 0.2.5.0
{-# INLINE pooledNewArray0 #-}
pooledNewArray0 :: (MonadIO m, Storable a) => Pool -> a -> [a] -> m (Ptr a)
pooledNewArray0 pool marker vals = liftIO (F.pooledNewArray0 pool marker vals)

-- | Unlifted 'F.with'.
--
-- @since 0.2.5.0
{-# INLINE with #-}
with :: (MonadUnliftIO m, Storable a) => a -> (Ptr a -> m b) -> m b
with val f = withRunInIO (\u -> F.with val (u . f))

-- | Lifted 'F.new'.
--
-- @since 0.2.5.0
{-# INLINE new #-}
new :: (MonadIO m, Storable a) => a -> m (Ptr a)
new = liftIO . F.new

-- | Lifted 'F.maybeNew'.
--
-- @since 0.2.5.0
{-# INLINE maybeNew #-}
maybeNew :: MonadIO m => (a -> m (Ptr b)) -> Maybe a -> m (Ptr b)
maybeNew = maybe (return nullPtr)

-- | Lifted 'F.maybeWith'.
--
-- @since 0.2.5.0
{-# INLINE maybeWith #-}
maybeWith ::
     MonadIO m
  => (a -> (Ptr b -> m c) -> m c)
  -> Maybe a
  -> (Ptr b -> m c)
  -> m c
maybeWith = maybe ($ nullPtr)

-- | Unlifted 'F.maybePeek'.
--
-- @since 0.2.5.0
{-# INLINE maybePeek #-}
maybePeek :: MonadUnliftIO m => (Ptr a -> m b) -> Ptr a -> m (Maybe b)
maybePeek peek_ ptr = withRunInIO (\u -> F.maybePeek (u . peek_) ptr)

-- | Lifted 'F.copyBytes'.
--
-- @since 0.2.5.0
{-# INLINE copyBytes #-}
copyBytes :: MonadIO m => Ptr a -> Ptr a -> Int -> m ()
copyBytes dest src size = liftIO (F.copyBytes dest src size)

-- | Lifted 'F.moveBytes'.
--
-- @since 0.2.5.0
{-# INLINE moveBytes #-}
moveBytes :: MonadIO m => Ptr a -> Ptr a -> Int -> m ()
moveBytes dest src size = liftIO (F.moveBytes dest src size)

#if MIN_VERSION_base(4,8,0)
-- | Lifted 'F.fillBytes'.
--
-- @since 0.2.5.0
{-# INLINE fillBytes #-}
fillBytes :: MonadIO m => Ptr a -> Word8 -> Int -> m ()
fillBytes dest char size = liftIO (F.fillBytes dest char size)
#endif