module GHC.Err.Located where
import GHC.SrcLoc
import GHC.Stack (CallStack, getCallStack)
import Prelude hiding (error, undefined)
import qualified Prelude
import Text.Printf
error :: (?callStack :: CallStack) => String -> a
error msg = Prelude.error (msg ++ "\n" ++ showCallStack ?callStack)
undefined :: (?callStack :: CallStack) => a
undefined = error "Prelude.undefined"
showCallStack :: CallStack -> String
showCallStack stk = case getCallStack stk of
_:locs -> unlines $ "Callstack:" : map format locs
_ -> Prelude.error "showCallStack: empty call-stack"
where
unlines = foldr1 (\x y -> x ++ "\n" ++ y)
format (fn, loc) = printf " %s, called at %s" fn (showSrcLoc loc)