ether-0.1.0.0: src/Control/Monad/Ether/Implicit/Except/TH.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Template Haskell utilities for exception handling.
module Control.Monad.Ether.Implicit.Except.TH (try', try) where
import qualified Language.Haskell.TH as TH
import Control.Ether.TH (deepN)
import Control.Monad.Ether.Implicit.Except
-- | Basic building block for 'try'. Runs an 'ExceptT' with a handler.
try' :: Functor m => ExceptT e m a -> (e -> a) -> m a
try' m h = either h id <$> runExceptT m
-- | Handle @n@ exceptions with supplied handlers.
--
-- > $(try 3) monadicComputation
-- > (\Exception1 -> ...)
-- > (\Exception2 -> ...)
-- > (\Exception3 -> ...)
try :: Int -> TH.ExpQ
try n = deepN n [|try'|]