Documentation
:: MonadRunInIO m | |
=> (a -> m c) | before |
-> (c -> m d) | after, on normal stop, or GC |
-> Unfold m (c, e) b | on exception |
-> (forall s. m s -> m (Either e s)) | try (exception handling) |
-> Unfold m c b | unfold to run |
-> Unfold m a b |
Run the alloc action a -> m c
with async exceptions disabled but keeping
blocking operations interruptible (see mask
). Use the
output c
as input to Unfold m c b
to generate an output stream. When
unfolding use the supplied try
operation forall s. m s -> m (Either e s)
to catch synchronous exceptions. If an exception occurs run the exception
handling unfold Unfold m (c, e) b
.
The cleanup action c -> m d
, runs whenever the stream ends normally, due
to a sync or async exception or if it gets garbage collected after a partial
lazy evaluation. See bracket
for the semantics of the cleanup action.
gbracket
can express all other exception handling combinators.
Inhibits stream fusion
Pre-release
finally :: (MonadAsync m, MonadCatch m) => (a -> m c) -> Unfold m a b -> Unfold m a b Source #
Unfold the input a
using Unfold m a b
, run an action on a
whenever
the unfold stops normally, aborts due to an exception or if it is garbage
collected after a partial lazy evaluation.
The semantics of the action a -> m c
are similar to the cleanup action
semantics in bracket
.
finally release = bracket return release
See also finally_
Inhibits stream fusion
Pre-release
bracket :: (MonadAsync m, MonadCatch m) => (a -> m c) -> (c -> m d) -> Unfold m c b -> Unfold m a b Source #
Run the alloc action a -> m c
with async exceptions disabled but keeping
blocking operations interruptible (see mask
). Use the
output c
as input to Unfold m c b
to generate an output stream.
c
is usually a resource under the state of monad m
, e.g. a file
handle, that requires a cleanup after use. The cleanup action c -> m d
,
runs whenever the stream ends normally, due to a sync or async exception or
if it gets garbage collected after a partial lazy evaluation.
bracket
only guarantees that the cleanup action runs, and it runs with
async exceptions enabled. The action must ensure that it can successfully
cleanup the resource in the face of sync or async exceptions.
When the stream ends normally or on a sync exception, cleanup action runs immediately in the current thread context, whereas in other cases it runs in the GC context, therefore, cleanup may be delayed until the GC gets to run.
Inhibits stream fusion
Pre-release
fromProducer :: MonadAsync m => Unfold m (SVar t m a) a Source #
Internal