fused-effects-exceptions: Handle exceptions thrown in IO with fused-effects.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain]

Provides Resource and Catch effects capable of reacting to and catching GHC's dynamic exceptions.


[Skip to ReadMe]

Properties

Versions0.1.0.0, 0.1.1.0, 0.2.0.0, 1.0.0.0, 1.0.0.0
Change logChangeLog.md
Dependenciesbase (>=4.7 && <5), fused-effects (>=1), transformers (>=0.4 && <0.6) [details]
LicenseBSD-3-Clause
Copyright2019 Josh Vera, Patrick Thomson, and Rob Rix
AuthorJosh Vera, Patrick Thomson, and Rob Rix
Maintainerpatrickt@github.com
CategoryControl
Home pagehttps://github.com/fused-effects/fused-effects-exceptions#readme
Source repositoryhead: git clone https://github.com/fused-effects/fused-effects-exceptions
UploadedTue Nov 12 19:16:42 UTC 2019 by patrick_thomson

Modules

[Index]

Downloads

Maintainers' corner

For package maintainers and hackage trustees


Readme for fused-effects-exceptions-1.0.0.0

[back to package description]

fused-effects-exceptions

Hackage BSD3 license Build Status

<!-- Setup, hidden from the rendered markdown.
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
module Main (module Main) where

import Control.Carrier.State.Strict
import Control.Effect.Exception

main :: IO ()
main = pure ()
-->

This package provides Control.Effect.Exception, a module that wraps the Control.Exception API from base with the vocabulary provided by the fused-effects library. These functions interact with GHC's support for dynamic exceptions, including functions like catch for exception handling and bracket for resource management.

Please be aware that injudicious use of these functions may provoke surprising interactions with carriers that thread a monadic state as a parameter, à la the Control.Carrier.State types provided by fused-effects. For example, a function like finally, which does not thread any state from its body to its handler block, may discard state writes in cleanup handlers:

discardsState :: IO Char
discardsState = execState 'a' ((throwIO (userError "urk") `finally` put @Char 'z')
    `catch` (\(_ :: IOException) -> pure ()))

Though the put @Char 'z' statement is evaluated, its effect is ultimately discarded; the result of executing the above is 'a'. If this behavior is a concern, a Control.Carrier.State.IORef carrier is provided, which fixes this issue given access to a MonadIO constraint. If it is not a concern (such as if the cleanup block is only run for its effects in IO), then the StateC carriers from fused-effects will suffice. For more information about the issues associated with this approach, consult Alexis King's excellent Demystifying MonadBaseControl.

Prior versions of this package provided a Catch effect; this has been excised in favor of the more-general Control.Effect.Exception, which provides more functionality without requiring any additional carriers beyond a Lift IO effect.