I found what I'd imagine to be a useful function in the illustrious async library that allows a thread to propagate an exception if and only if the exception passes a predicate - with a type of SomeException -> Bool
.
This is the dilemma - SomeException
doesn't implement Eq
, so casting my particular exception type into SomeException
would be fruitless. Likewise, I tried to use cast
from Data.Typeable
, but that didn't seem to work either.
cast
from Data.Typeable
will work, you just have to hold it right. For example:
isIOError :: SomeException -> Bool
isIOError (SomeException e) = isJust (cast e :: Maybe IOError)
Of course you can write more exciting predicates that actually do some computation with your custom exception instance -- this one is just to demonstrate the base plan.