Control.Monad.Trans.Resource.Internal

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

Safe Haskell | Safe
Language | Haskell98

Control.Monad.Trans.Resource.Internal

Synopsis

- data InvalidAccess = InvalidAccess {
  - functionName :: String
  }
- class (MonadThrow m, MonadIO m, Applicative m, MonadBase IO m) => MonadResource m where
- data ReleaseKey = ReleaseKey !(IORef ReleaseMap) !Int
- data ReleaseMap
  - = ReleaseMap !NextKey !RefCount !(IntMap (ReleaseType -> IO ()))
  - | ReleaseMapClosed
- type ResIO a = ResourceT IO a
- newtype ResourceT m 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

# 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

Show InvalidAccess # |
Methods showsPrec :: Int -> InvalidAccess -> ShowS # show :: InvalidAccess -> String # showList :: [InvalidAccess] -> ShowS #
Exception InvalidAccess # |
Methods toException :: InvalidAccess -> SomeException # fromException :: SomeException -> Maybe InvalidAccess # displayException :: InvalidAccess -> String #

class (MonadThrow m, MonadIO m, Applicative m, MonadBase IO m) => MonadResource m 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 `MonadBaseControl IO 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

Minimal complete definition

liftResourceT

Methods

liftResourceT :: ResourceT IO a -> m a #

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

Since 0.4.0

Instances

MonadResource m => MonadResource (ListT m) # |
Methods liftResourceT :: ResourceT IO a -> ListT m a #
MonadResource m => MonadResource (MaybeT m) # |
Methods liftResourceT :: ResourceT IO a -> MaybeT m a #
(MonadThrow m, MonadBase IO m, MonadIO m, Applicative m) => MonadResource (ResourceT m) # |
Methods liftResourceT :: ResourceT IO a -> ResourceT m a #
(Error e, MonadResource m) => MonadResource (ErrorT e m) # |
Methods liftResourceT :: ResourceT IO a -> ErrorT e m a #
MonadResource m => MonadResource (ExceptT e m) # |
Methods liftResourceT :: ResourceT IO a -> ExceptT e m a #
MonadResource m => MonadResource (StateT s m) # |
Methods liftResourceT :: ResourceT IO a -> StateT s m a #
MonadResource m => MonadResource (StateT s m) # |
Methods liftResourceT :: ResourceT IO a -> StateT s m a #
(Monoid w, MonadResource m) => MonadResource (WriterT w m) # |
Methods liftResourceT :: ResourceT IO a -> WriterT w m a #
(Monoid w, MonadResource m) => MonadResource (WriterT w m) # |
Methods liftResourceT :: ResourceT IO a -> WriterT w m a #
MonadResource m => MonadResource (IdentityT * m) # |
Methods liftResourceT :: ResourceT IO a -> IdentityT * m a #
MonadResource m => MonadResource (ContT * r m) # |
Methods liftResourceT :: ResourceT IO a -> ContT * r m a #
MonadResource m => MonadResource (ReaderT * r m) # |
Methods liftResourceT :: ResourceT IO a -> ReaderT * r m a #
(Monoid w, MonadResource m) => MonadResource (RWST r w s m) # |
Methods liftResourceT :: ResourceT IO a -> RWST r w s m a #
(Monoid w, MonadResource m) => MonadResource (RWST r w s m) # |
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 a = ResourceT IO a #

Convenient alias for `ResourceT IO`.

newtype ResourceT m 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

MFunctor ResourceT # | Since 0.4.7
Methods hoist :: Monad m => (forall a. m a -> n a) -> ResourceT m b -> ResourceT n b #
MMonad ResourceT # | Since 0.4.7
Methods embed :: Monad n => (forall a. m a -> ResourceT n a) -> ResourceT m b -> ResourceT n b #
MonadTrans ResourceT # |
Methods lift :: Monad m => m a -> ResourceT m a #
MonadTransControl ResourceT # |
Associated Types type StT (ResourceT :: (* -> *) -> * -> *) a :: * # Methods liftWith :: Monad m => (Run ResourceT -> m a) -> ResourceT m a # restoreT :: Monad m => m (StT ResourceT a) -> ResourceT m a #
MonadRWS r w s m => MonadRWS r w s (ResourceT m) # |
MonadBase b m => MonadBase b (ResourceT m) # |
Methods liftBase :: b α -> ResourceT m α #
MonadBaseControl b m => MonadBaseControl b (ResourceT m) # |
Associated Types type StM (ResourceT m :: * -> *) a :: * # Methods liftBaseWith :: (RunInBase (ResourceT m) b -> b a) -> ResourceT m a # restoreM :: StM (ResourceT m) a -> ResourceT m a #
MonadWriter w m => MonadWriter w (ResourceT m) # |
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 #
MonadState s m => MonadState s (ResourceT m) # |
Methods get :: ResourceT m s # put :: s -> ResourceT m () # state :: (s -> (a, s)) -> ResourceT m a #
MonadReader r m => MonadReader r (ResourceT m) # |
Methods ask :: ResourceT m r # local :: (r -> r) -> ResourceT m a -> ResourceT m a # reader :: (r -> a) -> ResourceT m a #
MonadError e m => MonadError e (ResourceT m) # |
Methods throwError :: e -> ResourceT m a # catchError :: ResourceT m a -> (e -> ResourceT m a) -> ResourceT m a #
Monad m => Monad (ResourceT m) # |
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 # fail :: String -> ResourceT m a #
Functor m => Functor (ResourceT m) # |
Methods fmap :: (a -> b) -> ResourceT m a -> ResourceT m b # (<$) :: a -> ResourceT m b -> ResourceT m a #
MonadFix m => MonadFix (ResourceT m) # | Since: 1.1.8
Methods mfix :: (a -> ResourceT m a) -> ResourceT m a #
Applicative m => Applicative (ResourceT m) # |
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 #
MonadIO m => MonadIO (ResourceT m) # |
Methods liftIO :: IO a -> ResourceT m a #
Alternative m => Alternative (ResourceT m) # | Since 1.1.5
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] #
MonadPlus m => MonadPlus (ResourceT m) # | Since 1.1.5
Methods mzero :: ResourceT m a # mplus :: ResourceT m a -> ResourceT m a -> ResourceT m a #
MonadThrow m => MonadThrow (ResourceT m) # |
Methods throwM :: Exception e => e -> ResourceT m a #
MonadCatch m => MonadCatch (ResourceT m) # |
Methods catch :: Exception e => ResourceT m a -> (e -> ResourceT m a) -> ResourceT m a #
MonadMask m => MonadMask (ResourceT m) # |
Methods mask :: ((forall a. ResourceT m a -> ResourceT m a) -> ResourceT m b) -> ResourceT m b # uninterruptibleMask :: ((forall a. ResourceT m a -> ResourceT m a) -> ResourceT m b) -> ResourceT m b #
MonadCont m => MonadCont (ResourceT m) # |
Methods callCC :: ((a -> ResourceT m b) -> ResourceT m a) -> ResourceT m a #
(MonadThrow m, MonadBase IO m, MonadIO m, Applicative m) => MonadResource (ResourceT m) # |
Methods liftResourceT :: ResourceT IO a -> ResourceT m a #
type StT ResourceT a # |
type StT ResourceT a = a
type StM (ResourceT m) a # |
type StM (ResourceT m) a = StM m a

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