# freer-catching
This is library for working with exceptions that are thrown during interpreation of free monad effects, at call time.
## How to use
This library exposes one effect:
```haskell
catching :: forall e f a r
. (Exception e, Member (Catching f e) r)
=> Eff '[f] a
-> Eff r (Either e a)
```
We take an effectful function over one effect `f` and we turn it into an effectful computation of a new effect which denotes that we have an obligation to catch exceptions when we interpret this effect.
We can then discharge this obligation by interpretting the effect `f` and and any `Catching` effects built on `f` by interpretting them both at the same time:
```haskell
runCatching :: forall e r v f
. (Member IO r, Member IO (f ': r))
=> (forall a q . Member IO q => Eff (f ': q) a -> Eff q a)
-> Eff (Catching f e : f : r) v
-> Eff r v
```
We can also interpret a `Catching f e` effect by way of another effect `g`:
```haskell
runCatching2 :: forall e r v f g
. (Member IO r, Member IO (f : r), Member IO (f : g : r))
=> (forall a q. Member g q => Eff (f : q) a -> Eff q a)
-> (forall a q. Member IO q => Eff (g : q) a -> Eff q a)
-> Eff (Catching f e : f : g : r) v
-> Eff r v
```