module Control.LensFunction.Exception
       (
         SomeLensFunctionException(..),
         NoLUBException(..),
         ChangedObservationException(..),
         ShapeMismatchException(..),
         ConstantUpdateException(..)
       ) where
import Control.Exception
import Data.Typeable (cast, Typeable)
data SomeLensFunctionException
  = forall e. Exception e => SomeLensFunctionException e
  deriving Typeable
instance Show SomeLensFunctionException where
  show (SomeLensFunctionException e) = show e 
instance Exception SomeLensFunctionException 
lfToException :: Exception e => e -> SomeException
lfToException = toException . SomeLensFunctionException
lfFromException :: Exception e => SomeException -> Maybe e
lfFromException x = do
    SomeLensFunctionException a <- fromException x
    cast a
data NoLUBException = NoLUBException String deriving (Typeable)
instance Show NoLUBException where
  show (NoLUBException s) = s ++ ": No LUB"
instance Exception NoLUBException where
  toException   = lfToException
  fromException = lfFromException
data ChangedObservationException
  = ChangedObservationException String
  deriving Typeable
instance Show ChangedObservationException where
  show (ChangedObservationException s) = s ++ ": Changed Observation"
instance Exception ChangedObservationException where
  toException   = lfToException
  fromException = lfFromException
data ShapeMismatchException = ShapeMismatchException String
                               deriving Typeable 
instance Show ShapeMismatchException where
  show (ShapeMismatchException s) = s ++ ": Shape Mismatch"
instance Exception ShapeMismatchException where
  toException   = lfToException
  fromException = lfFromException
data ConstantUpdateException = ConstantUpdateException String
                               deriving Typeable 
instance Show ConstantUpdateException where 
  show (ConstantUpdateException s) = s ++ ": Update on Constant"
instance Exception ConstantUpdateException where
  toException   = lfToException
  fromException = lfFromException