{-# LANGUAGE DeriveDataTypeable #-}
module Internal.Error
( failure
, violation
, impossible
, unimplemented
) where
import Control.Exception
import Data.Typeable
data Violation = Violation String String deriving ( Typeable )
data Failure = Failure String String deriving ( Typeable )
instance Show Failure where
show :: Failure -> String
show (Failure f :: String
f m :: String
m) = String
f String -> ShowS
forall a. [a] -> [a] -> [a]
++ ":" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
m
instance Show Violation where
show :: Violation -> String
show (Violation f :: String
f m :: String
m) = "Bug in " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
f String -> ShowS
forall a. [a] -> [a] -> [a]
++ ", please report: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
m
instance Exception Violation
instance Exception Failure
failure :: String
-> String
-> a
failure :: String -> String -> a
failure f :: String
f msg :: String
msg = Failure -> a
forall a e. Exception e => e -> a
throw (Failure -> a) -> Failure -> a
forall a b. (a -> b) -> a -> b
$ String -> String -> Failure
Failure String
f String
msg
violation :: String
-> String
-> a
violation :: String -> String -> a
violation f :: String
f msg :: String
msg = Violation -> a
forall a e. Exception e => e -> a
throw (Violation -> a) -> Violation -> a
forall a b. (a -> b) -> a -> b
$ String -> String -> Violation
Violation String
f String
msg
impossible :: String
-> a
impossible :: String -> a
impossible f :: String
f = String -> String -> a
forall a. String -> String -> a
violation String
f "The impossible happened."
unimplemented :: String
-> a
unimplemented :: String -> a
unimplemented f :: String
f = String -> String -> a
forall a. String -> String -> a
failure String
f "Unimplemented."