+-- helper type for simplifying the type casting logic below
+data Caster = forall e . ExceptionBase.Exception e => Caster (e -> Exception)
+
+instance New.Exception Exception where
+ -- We need to collect all the sorts of exceptions that used to be
+ -- bundled up into the Exception type, and rebundle them for
+ -- legacy handlers.
+ fromException (SomeException exc) = foldr tryCast Nothing casters where
+ tryCast (Caster f) e = case cast exc of
+ Just exc -> Just (f exc)
+ _ -> e
+ casters =
+ [Caster (\e -> e),
+ Caster (\exc -> ArithException exc),
+ Caster (\exc -> ArrayException exc),
+ Caster (\(New.AssertionFailed err) -> AssertionFailed err),
+ Caster (\exc -> AsyncException exc),
+ Caster (\New.BlockedOnDeadMVar -> BlockedOnDeadMVar),
+ Caster (\New.BlockedIndefinitely -> BlockedIndefinitely),
+ Caster (\New.NestedAtomically -> NestedAtomically),
+ Caster (\New.Deadlock -> Deadlock),
+ Caster (\exc -> DynException exc),
+ Caster (\(New.ErrorCall err) -> ErrorCall err),
+ Caster (\exc -> ExitException exc),
+ Caster (\exc -> IOException exc),
+ Caster (\(New.NoMethodError err) -> NoMethodError err),
+ Caster (\New.NonTermination -> NonTermination),
+ Caster (\(New.PatternMatchFail err) -> PatternMatchFail err),
+ Caster (\(New.RecConError err) -> RecConError err),
+ Caster (\(New.RecSelError err) -> RecSelError err),
+ Caster (\(New.RecUpdError err) -> RecUpdError err)]
+
+ -- Unbundle exceptions.
+ toException (ArithException exc) = SomeException exc
+ toException (ArrayException exc) = SomeException exc
+ toException (AssertionFailed err) = SomeException (New.AssertionFailed err)
+ toException (AsyncException exc) = SomeException exc
+ toException BlockedOnDeadMVar = SomeException New.BlockedOnDeadMVar
+ toException BlockedIndefinitely = SomeException New.BlockedIndefinitely
+ toException NestedAtomically = SomeException New.NestedAtomically
+ toException Deadlock = SomeException New.Deadlock
+ toException (DynException exc) = SomeException exc
+ toException (ErrorCall err) = SomeException (New.ErrorCall err)
+ toException (ExitException exc) = SomeException exc
+ toException (IOException exc) = SomeException exc
+ toException (NoMethodError err) = SomeException (New.NoMethodError err)
+ toException NonTermination = SomeException NonTermination
+ toException (PatternMatchFail err) = SomeException (New.PatternMatchFail err)
+ toException (RecConError err) = SomeException (New.RecConError err)
+ toException (RecSelError err) = SomeException (New.RecSelError err)
+ toException (RecUpdError err) = SomeException (New.RecUpdError err)