resourcet-1.2.4.3: Deterministic allocation and freeing of scarce resources.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Acquire.Internal

Synopsis

Documentation

newtype Acquire a #

A method for acquiring a scarce resource, providing the means of freeing it when no longer needed. This data type provides Functor/Applicative/Monad instances for composing different resources together. You can allocate these resources using either the bracket pattern (via with) or using ResourceT (via allocateAcquire).

This concept was originally introduced by Gabriel Gonzalez and described at: http://www.haskellforall.com/2013/06/the-resource-applicative.html. The implementation in this package is slightly different, due to taking a different approach to async exception safety.

Since: 1.1.0

Constructors

Acquire ((forall b. IO b -> IO b) -> IO (Allocated a)) 

Instances

Instances details
Monad Acquire # 
Instance details

Defined in Data.Acquire.Internal

Methods

(>>=) :: Acquire a -> (a -> Acquire b) -> Acquire b #

(>>) :: Acquire a -> Acquire b -> Acquire b #

return :: a -> Acquire a #

Functor Acquire # 
Instance details

Defined in Data.Acquire.Internal

Methods

fmap :: (a -> b) -> Acquire a -> Acquire b #

(<$) :: a -> Acquire b -> Acquire a #

Applicative Acquire # 
Instance details

Defined in Data.Acquire.Internal

Methods

pure :: a -> Acquire a #

(<*>) :: Acquire (a -> b) -> Acquire a -> Acquire b #

liftA2 :: (a -> b -> c) -> Acquire a -> Acquire b -> Acquire c #

(*>) :: Acquire a -> Acquire b -> Acquire b #

(<*) :: Acquire a -> Acquire b -> Acquire a #

MonadIO Acquire # 
Instance details

Defined in Data.Acquire.Internal

Methods

liftIO :: IO a -> Acquire a #

data Allocated a #

Constructors

Allocated !a !(ReleaseType -> IO ()) 

with :: MonadUnliftIO m => Acquire a -> (a -> m b) -> m b #

Allocate the given resource and provide it to the provided function. The resource will be freed as soon as the inner block is exited, whether normally or via an exception. This function is similar in function to bracket.

Since: 1.1.0

mkAcquire #

Arguments

:: IO a

acquire the resource

-> (a -> IO ())

free the resource

-> Acquire a 

Create an Acquire value using the given allocate and free functions.

To acquire and free the resource in an arbitrary monad with MonadUnliftIO, do the following:

acquire <- withRunInIO $ \runInIO ->
  return $ mkAcquire (runInIO create) (runInIO . free)

Note that this is only safe if the Acquire is run and freed within the same monadic scope it was created in.

Since: 1.1.0

data ReleaseType #

The way in which a release is called.

Since: 1.1.2

Instances

Instances details
Bounded ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

Enum ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

Eq ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

Ord ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

Read ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

Show ReleaseType # 
Instance details

Defined in Data.Acquire.Internal

mkAcquireType #

Arguments

:: IO a

acquire the resource

-> (a -> ReleaseType -> IO ())

free the resource

-> Acquire a 

Same as mkAcquire, but the cleanup function will be informed of how cleanup was initiated. This allows you to distinguish, for example, between normal and exceptional exits.

To acquire and free the resource in an arbitrary monad with MonadUnliftIO, do the following:

acquire <- withRunInIO $ \runInIO ->
  return $ mkAcquireType (runInIO create) (\a -> runInIO . free a)

Note that this is only safe if the Acquire is run and freed within the same monadic scope it was created in.

Since: 1.1.2