Control.Monad.Trans.Resource.Internal

resourcet-1.3.0: Deterministic allocation and freeing of scarce resources.

Safe Haskell | None
Language | Haskell2010

Control.Monad.Trans.Resource.Internal

Synopsis

- data InvalidAccess = InvalidAccess {
  - functionName :: String
  }
- class MonadIO m => MonadResource (m :: Type -> Type) where
  - liftResourceT :: ResourceT IO a -> m a
- data ReleaseKey = ReleaseKey !(IORef ReleaseMap) !Int
- data ReleaseMap
  - = ReleaseMap !NextKey !RefCount !(IntMap (ReleaseType -> IO ()))
  - | ReleaseMapClosed
- type ResIO = ResourceT IO
- newtype ResourceT (m :: Type -> Type) a = ResourceT {
  - unResourceT :: IORef ReleaseMap -> m a
  }
- stateAlloc :: IORef ReleaseMap -> IO ()
- stateCleanup :: ReleaseType -> IORef ReleaseMap -> IO ()
- transResourceT :: (m a -> n b) -> ResourceT m a -> ResourceT n b
- register' :: IORef ReleaseMap -> IO () -> IO ReleaseKey
- registerType :: IORef ReleaseMap -> (ReleaseType -> IO ()) -> IO ReleaseKey
- data ResourceCleanupException = ResourceCleanupException {
  - rceOriginalException :: !(Maybe SomeException)
  - rceFirstCleanupException :: !SomeException
  - rceOtherCleanupExceptions :: ![SomeException]
  }
- stateCleanupChecked :: Maybe SomeException -> IORef ReleaseMap -> IO ()

# Documentation

data InvalidAccess #

Indicates either an error in the library, or misuse of it (e.g., a `ResourceT`'s state is accessed after being released).

Since 0.3.0

Constructors

InvalidAccess |
Fields functionName :: String

#### Instances

Instances details

Exception InvalidAccess # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods toException :: InvalidAccess -> SomeException # fromException :: SomeException -> Maybe InvalidAccess # displayException :: InvalidAccess -> String # backtraceDesired :: InvalidAccess -> Bool #
Show InvalidAccess # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods showsPrec :: Int -> InvalidAccess -> ShowS # show :: InvalidAccess -> String # showList :: [InvalidAccess] -> ShowS #

class MonadIO m => MonadResource (m :: Type -> Type) where #

A `Monad` which allows for safe resource allocation. In theory, any monad transformer stack which includes a `ResourceT` can be an instance of `MonadResource`.

Note: `runResourceT` has a requirement for a `MonadUnliftIO m` monad, which allows control operations to be lifted. A `MonadResource` does not have this requirement. This means that transformers such as `ContT` can be an instance of `MonadResource`. However, the `ContT` wrapper will need to be unwrapped before calling `runResourceT`.

Since 0.3.0

Methods

liftResourceT :: ResourceT IO a -> m a #

Lift a `ResourceT IO` action into the current `Monad`.

Since 0.4.0

#### Instances

Instances details

MonadIO m => MonadResource (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> ResourceT m a #
MonadResource m => MonadResource (MaybeT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> MaybeT m a #
MonadResource m => MonadResource (ExceptT e m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> ExceptT e m a #
MonadResource m => MonadResource (IdentityT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> IdentityT m a #
MonadResource m => MonadResource (ReaderT r m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> ReaderT r m a #
MonadResource m => MonadResource (StateT s m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> StateT s m a #
MonadResource m => MonadResource (StateT s m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> StateT s m a #
(Monoid w, MonadResource m) => MonadResource (WriterT w m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> WriterT w m a #
(Monoid w, MonadResource m) => MonadResource (WriterT w m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> WriterT w m a #
MonadResource m => MonadResource (ContT r m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> ContT r m a #
(Monoid w, MonadResource m) => MonadResource (RWST r w s m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> RWST r w s m a #
(Monoid w, MonadResource m) => MonadResource (RWST r w s m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> RWST r w s m a #

data ReleaseKey #

A lookup key for a specific release action. This value is returned by `register` and `allocate`, and is passed to `release`.

Since 0.3.0

Constructors

ReleaseKey !(IORef ReleaseMap) !Int |

data ReleaseMap #

Constructors

ReleaseMap !NextKey !RefCount !(IntMap (ReleaseType -> IO ())) |
ReleaseMapClosed |

type ResIO = ResourceT IO #

Convenient alias for `ResourceT IO`.

newtype ResourceT (m :: Type -> Type) a #

The Resource transformer. This transformer keeps track of all registered actions, and calls them upon exit (via `runResourceT`). Actions may be registered via `register`, or resources may be allocated atomically via `allocate`. `allocate` corresponds closely to `bracket`.

Releasing may be performed before exit via the `release` function. This is a highly recommended optimization, as it will ensure that scarce resources are freed early. Note that calling `release` will deregister the action, so that a release action will only ever be called once.

Since 0.3.0

Constructors

ResourceT |
Fields unResourceT :: IORef ReleaseMap -> m a

#### Instances

Instances details

MonadTrans ResourceT # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods lift :: Monad m => m a -> ResourceT m a #
MonadRWS r w s m => MonadRWS r w s (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal
MonadError e m => MonadError e (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods throwError :: e -> ResourceT m a # catchError :: ResourceT m a -> (e -> ResourceT m a) -> ResourceT m a #
MonadReader r m => MonadReader r (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods ask :: ResourceT m r # local :: (r -> r) -> ResourceT m a -> ResourceT m a # reader :: (r -> a) -> ResourceT m a #
MonadState s m => MonadState s (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods get :: ResourceT m s # put :: s -> ResourceT m () # state :: (s -> (a, s)) -> ResourceT m a #
MonadWriter w m => MonadWriter w (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods writer :: (a, w) -> ResourceT m a # tell :: w -> ResourceT m () # listen :: ResourceT m a -> ResourceT m (a, w) # pass :: ResourceT m (a, w -> w) -> ResourceT m a #
MonadIO m => MonadIO (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftIO :: IO a -> ResourceT m a #
MonadCatch m => MonadCatch (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods catch :: (HasCallStack, Exception e) => ResourceT m a -> (e -> ResourceT m a) -> ResourceT m a #
MonadMask m => MonadMask (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods mask :: HasCallStack => ((forall a. ResourceT m a -> ResourceT m a) -> ResourceT m b) -> ResourceT m b # uninterruptibleMask :: HasCallStack => ((forall a. ResourceT m a -> ResourceT m a) -> ResourceT m b) -> ResourceT m b # generalBracket :: HasCallStack => ResourceT m a -> (a -> ExitCase b -> ResourceT m c) -> (a -> ResourceT m b) -> ResourceT m (b, c) #
MonadThrow m => MonadThrow (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods throwM :: (HasCallStack, Exception e) => e -> ResourceT m a #
Alternative m => Alternative (ResourceT m) # | Since 1.1.5
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods empty :: ResourceT m a # (<|>) :: ResourceT m a -> ResourceT m a -> ResourceT m a # some :: ResourceT m a -> ResourceT m [a] # many :: ResourceT m a -> ResourceT m [a] #
Applicative m => Applicative (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods pure :: a -> ResourceT m a # (<*>) :: ResourceT m (a -> b) -> ResourceT m a -> ResourceT m b # liftA2 :: (a -> b -> c) -> ResourceT m a -> ResourceT m b -> ResourceT m c # (*>) :: ResourceT m a -> ResourceT m b -> ResourceT m b # (<*) :: ResourceT m a -> ResourceT m b -> ResourceT m a #
Functor m => Functor (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods fmap :: (a -> b) -> ResourceT m a -> ResourceT m b # (<$) :: a -> ResourceT m b -> ResourceT m a #
Monad m => Monad (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods (>>=) :: ResourceT m a -> (a -> ResourceT m b) -> ResourceT m b # (>>) :: ResourceT m a -> ResourceT m b -> ResourceT m b # return :: a -> ResourceT m a #
MonadPlus m => MonadPlus (ResourceT m) # | Since 1.1.5
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods mzero :: ResourceT m a # mplus :: ResourceT m a -> ResourceT m a -> ResourceT m a #
MonadFail m => MonadFail (ResourceT m) # | Since: 1.2.2
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods fail :: String -> ResourceT m a #
MonadFix m => MonadFix (ResourceT m) # | Since: 1.1.8
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods mfix :: (a -> ResourceT m a) -> ResourceT m a #
MonadCont m => MonadCont (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods callCC :: ((a -> ResourceT m b) -> ResourceT m a) -> ResourceT m a #
PrimMonad m => PrimMonad (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Associated Types
type PrimState (ResourceT m) |
Instance details Defined in Control.Monad.Trans.Resource.Internal type PrimState (ResourceT m) = PrimState m
Methods primitive :: (State# (PrimState (ResourceT m)) -> (# State# (PrimState (ResourceT m)), a #)) -> ResourceT m a #
MonadIO m => MonadResource (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods liftResourceT :: ResourceT IO a -> ResourceT m a #
MonadUnliftIO m => MonadUnliftIO (ResourceT m) # | Since: 1.1.10
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods withRunInIO :: ((forall a. ResourceT m a -> IO a) -> IO b) -> ResourceT m b #
type PrimState (ResourceT m) # |
Instance details Defined in Control.Monad.Trans.Resource.Internal type PrimState (ResourceT m) = PrimState m

stateAlloc :: IORef ReleaseMap -> IO () #

stateCleanup :: ReleaseType -> IORef ReleaseMap -> IO () #

transResourceT :: (m a -> n b) -> ResourceT m a -> ResourceT n b #

Transform the monad a `ResourceT` lives in. This is most often used to strip or add new transformers to a stack, e.g. to run a `ReaderT`.

Note that this function is a slight generalization of `hoist`.

Since 0.3.0

register' :: IORef ReleaseMap -> IO () -> IO ReleaseKey #

registerType :: IORef ReleaseMap -> (ReleaseType -> IO ()) -> IO ReleaseKey #

Since 1.1.2

data ResourceCleanupException #

Thrown when one or more cleanup functions themselves throw an exception during cleanup.

Since: 1.1.11

Constructors

ResourceCleanupException |
Fields rceOriginalException :: !(Maybe SomeException) If the `ResourceT` block exited due to an exception, this is that exception. Since: 1.1.11 rceFirstCleanupException :: !SomeException The first cleanup exception. We keep this separate from `rceOtherCleanupExceptions` to prove that there's at least one (i.e., a non-empty list). Since: 1.1.11 rceOtherCleanupExceptions :: ![SomeException] All other exceptions in cleanups. Since: 1.1.11

#### Instances

Instances details

Exception ResourceCleanupException # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods toException :: ResourceCleanupException -> SomeException # fromException :: SomeException -> Maybe ResourceCleanupException # displayException :: ResourceCleanupException -> String # backtraceDesired :: ResourceCleanupException -> Bool #
Show ResourceCleanupException # |
Instance details Defined in Control.Monad.Trans.Resource.Internal Methods showsPrec :: Int -> ResourceCleanupException -> ShowS # show :: ResourceCleanupException -> String # showList :: [ResourceCleanupException] -> ShowS #

stateCleanupChecked #

Arguments

:: Maybe SomeException | exception that killed the `ResourceT`, if present
-> IORef ReleaseMap |
-> IO () |

Clean up a release map, but throw a `ResourceCleanupException` if anything goes wrong in the cleanup handlers.

Since: 1.1.11