Description
Reflect exceptions using phantom types.
Description
This library provides interface similar to extensible-exceptions. It introduces Throws
monad transformer that uses phantom type to tag code that may raise exception. Intention is to make exceptions explicit and to enforce exception handling.
README.md
Tagged Exception Core
Description
Reflect exceptions using phantom types. This library provides core API and others may build on top of it.
Usage Example
Example of reflecting reised exception in type:
{-# LANGUAGE DeriveDataTypeable #-}
import Control.Exception (Exception)
import Control.Monad.TaggedException (Throws)
import qualified Control.Monad.TaggedException as E (liftT, throw)
import Data.Typeable (Typeable)
data NotReady = NotReady String
deriving (Show, Typeable)
-- Both required by Exception class
instance Exception NotReady
myFunction :: Input -> Throws NotReady IO Output
myFunction input = do
-- ... some stuff ...
-- isReady :: Input -> IO Bool
ready <- E.liftT $ isReady input
unless ready
. E.throw $ NotReady "Resource of myFunction is not ready."
-- ... some other stuff ...
License
The BSD 3-Clause License, see LICENSE file for details.
Contributions
Contributions, pull requests and bug reports are welcome! Please don't be afraid to contact author using GitHub or by e-mail.