content: {-# LANGUAGE ScopedTypeVariables #-}
  
  module Witch.TryFromException where
  
  import qualified Control.Exception as Exception
  import qualified Data.Proxy as Proxy
  import qualified Data.Typeable as Typeable
  
  -- | This exception is thrown when a @TryFrom@ conversion fails. It has the
  -- original @source@ value that caused the failure and it knows the @target@
  -- type it was trying to convert into. It also has an optional
  -- 'Exception.SomeException' for communicating what went wrong while
  -- converting.
  data TryFromException source target
    = TryFromException
        source
        (Maybe Exception.SomeException)
  
  instance
    ( Show source,
      Typeable.Typeable source,
      Typeable.Typeable target
    ) =>
    Show (TryFromException source target)
    where
    showsPrec d (TryFromException x e) =
      showParen (d > 10) $
        showString "TryFromException @"
          . showsPrec 11 (Typeable.typeRep (Proxy.Proxy :: Proxy.Proxy source))
          . showString " @"
          . showsPrec 11 (Typeable.typeRep (Proxy.Proxy :: Proxy.Proxy target))
          . showChar ' '
          . showsPrec 11 x
          . showChar ' '
          . showsPrec 11 e
  
  instance
    ( Show source,
      Typeable.Typeable source,
      Typeable.Typeable target
    ) =>
    Exception.Exception (TryFromException source target)
  