# effect-handlers
This is an extensible effects library for Haskell taking inspiration from the [Eff language](http://www.eff-lang.org/).
See these papers for the ideas and theory behind the library:
- [O. Kammar et al: Handlers in Action!](http://homepages.inf.ed.ac.uk/slindley/papers/handlers.pdf)
- [A. Bauer, M. Pretnar: Programming with Algebraic Effects and Handlers](http://arxiv.org/abs/1203.1539)
- [O Kiselyov, A Sabry, C Swords: Extensible Effects](http://dl.acm.org/citation.cfm?id=2503791)
Implementation wise it's most close to [extensible-effects](http://hackage.haskell.org/package/extensible-effects) (also see the Extensible Effects paper) but it implements deep handlers instead of shallow.
## What does this library provide?
There is the `Eff` monad type and modules for pre-implemented effects.
- `Exception`
- `IO`
- `Reader`
- `Search`
- `State`
- `Writer`
It is easy to define your own effects and combine them.
## Example
Most of the types are inferred, you only need to provide enough to tell the compiler how to specialize some effect handlers (e.g. readerHandler).
```haskell
import Control.Effects.Cont.Eff
import Control.Effects.Cont.Reader
import Control.Effects.Cont.Exception
program = do
v <- ask
if v < 15
then throw $ show v
else return (v+1)
run n = runPure
. handle exceptionHandler
. handle (readerHandler n)
res :: Integer -> Either String Integer
res n = run n program
```
## Documentation
Haddock docs are [available online](http://edofic.github.io/effect-handlers)