-- ------------------------------------------------------------

{- |
   Module     : Control.Arrow.ArrowExc
   Copyright  : Copyright (C) 2010 Uwe Schmidt
   License    : MIT

   Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
   Stability  : experimental
   Portability: not portable

   The exception arrow class

-}

-- ------------------------------------------------------------

module Control.Arrow.ArrowExc
    ( ArrowExc(..)
    )
where

import           Control.Arrow
import           Control.Arrow.ArrowIO

import           Control.Exception      ( SomeException
                                        )

class (Arrow a, ArrowChoice a, ArrowZero a, ArrowIO a) => ArrowExc a where
    tryA        :: a b c -> a b (Either SomeException c)

    catchA      :: a b c -> a SomeException c -> a b c
    catchA f h  = tryA f
                  >>>
                  ( h ||| returnA )


-- ------------------------------------------------------------