{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE UnicodeSyntax #-}
{- |
Description : Projections into the Haskell exception hierarchy
Copyright : Copyright 2022 Shea Levy.
License : Apache-2.0
Maintainer : shea@shealevy.com
Provides 'Exceptable' for error types which can be projected into
the Haskell exception hierarchy.
-}
module Data.Exceptable where
import Control.Exception
import Data.Typeable
import Data.Void
-- | Types which can be projected into the Haskell exception hierarchy
class Exceptable e where
toSomeException ∷ e → SomeException
instance Exceptable SomeException where
toSomeException = id
instance Exceptable Void where
toSomeException = absurd
-- | An 'Exception' representing a failure in the 'Either' monad.
newtype EitherException e = EitherException e deriving stock (Show)
instance (Show e, Typeable e) ⇒ Exception (EitherException e)
instance (Show e, Typeable e) ⇒ Exceptable (EitherException e) where
toSomeException = toException
-- | An 'Exception' representing the 'Nothing' case in a 'Maybe' monad.
data NothingException = NothingException deriving (Show)
instance Exception NothingException
instance Exceptable e ⇒ Exceptable (Maybe e) where
toSomeException (Just e) = toSomeException e
toSomeException Nothing = toException NothingException
instance (Show e, Typeable e, Exceptable e') ⇒ Exceptable (Either e e') where
toSomeException (Left e) = toException $ EitherException e
toSomeException (Right e) = toSomeException e
instance Exceptable e ⇒ Exceptable (e, s) where
toSomeException (e, _) = toSomeException e
instance Exceptable e ⇒ Exceptable (e, s, w) where
toSomeException (e, _, _) = toSomeException e