c-expr-dsl-0.1.0.0: src/C/Expr/Util/Panic.hs
module C.Expr.Util.Panic (
panicPure
, panicIO
) where
import Control.Exception
import Control.Monad.IO.Class
import GHC.Stack
-- | Unexpected (e.g. invariant violation) conditions.
data PanicException = PanicException !CallStack !String
deriving Show
instance Exception PanicException where
displayException (PanicException cs msg) = unlines
[ "PANIC!: the impossible happened"
, pleaseReport
, msg
, prettyCallStack cs
]
pleaseReport :: String
pleaseReport = "Please report this as a bug at https://github.com/well-typed/c-expr/issues/"
-- | Panic in pure context
panicPure :: HasCallStack => String -> a
panicPure msg = throw (PanicException callStack msg)
-- | Panic in IO
panicIO :: (HasCallStack, MonadIO m) => String -> m a
panicIO msg = liftIO (throwIO (PanicException callStack msg))