Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- newtype LineNo = LineNo { }
-
newtype
ColumnNo
=
ColumnNo
{
- unColumnNo :: Int
-
data
Span
=
Span
{
- spanFile :: ! FilePath
- spanStartLine :: ! LineNo
- spanStartColumn :: ! ColumnNo
- spanEndLine :: ! LineNo
- spanEndColumn :: ! ColumnNo
- getCaller :: CallStack -> Maybe Span
- data CallStack
- type HasCallStack = ?callStack :: CallStack
- callStack :: HasCallStack => CallStack
- withFrozenCallStack :: HasCallStack => ( HasCallStack => a) -> a
Documentation
Instances
Enum LineNo Source # | |
Defined in Hedgehog.Internal.Source succ :: LineNo -> LineNo Source # pred :: LineNo -> LineNo Source # toEnum :: Int -> LineNo Source # fromEnum :: LineNo -> Int Source # enumFrom :: LineNo -> [ LineNo ] Source # enumFromThen :: LineNo -> LineNo -> [ LineNo ] Source # enumFromTo :: LineNo -> LineNo -> [ LineNo ] Source # enumFromThenTo :: LineNo -> LineNo -> LineNo -> [ LineNo ] Source # |
|
Eq LineNo Source # | |
Integral LineNo Source # | |
Defined in Hedgehog.Internal.Source |
|
Num LineNo Source # | |
Defined in Hedgehog.Internal.Source |
|
Ord LineNo Source # | |
Real LineNo Source # | |
Defined in Hedgehog.Internal.Source toRational :: LineNo -> Rational Source # |
|
Show LineNo Source # | |
Instances
Span | |
|
Re-exports from GHC.Stack
CallStack
s are a lightweight method of obtaining a
partial call-stack at any point in the program.
A function can request its call-site with the
HasCallStack
constraint.
For example, we can define
putStrLnWithCallStack :: HasCallStack => String -> IO ()
as a variant of
putStrLn
that will get its call-site and print it,
along with the string given as argument. We can access the
call-stack inside
putStrLnWithCallStack
with
callStack
.
putStrLnWithCallStack :: HasCallStack => String -> IO () putStrLnWithCallStack msg = do putStrLn msg putStrLn (prettyCallStack callStack)
Thus, if we call
putStrLnWithCallStack
we will get a formatted call-stack
alongside our string.
>>>
putStrLnWithCallStack "hello"
hello CallStack (from HasCallStack): putStrLnWithCallStack, called at <interactive>:2:1 in interactive:Ghci1
GHC solves
HasCallStack
constraints in three steps:
-
If there is a
CallStack
in scope -- i.e. the enclosing function has aHasCallStack
constraint -- GHC will append the new call-site to the existingCallStack
. -
If there is no
CallStack
in scope -- e.g. in the GHCi session above -- and the enclosing definition does not have an explicit type signature, GHC will infer aHasCallStack
constraint for the enclosing definition (subject to the monomorphism restriction). -
If there is no
CallStack
in scope and the enclosing definition has an explicit type signature, GHC will solve theHasCallStack
constraint for the singletonCallStack
containing just the current call-site.
CallStack
s do not interact with the RTS and do not require compilation
with
-prof
. On the other hand, as they are built up explicitly via the
HasCallStack
constraints, they will generally not contain as much
information as the simulated call-stacks maintained by the RTS.
A
CallStack
is a
[(String, SrcLoc)]
. The
String
is the name of
function that was called, the
SrcLoc
is the call-site. The list is
ordered with the most recently called function at the head.
NOTE: The intrepid user may notice that
HasCallStack
is just an
alias for an implicit parameter
?callStack :: CallStack
. This is an
implementation detail and
should not
be considered part of the
CallStack
API, we may decide to change the implementation in the
future.
Since: base-4.8.1.0
type HasCallStack = ?callStack :: CallStack Source #
Request a CallStack.
NOTE: The implicit parameter
?callStack :: CallStack
is an
implementation detail and
should not
be considered part of the
CallStack
API, we may decide to change the implementation in the
future.
Since: base-4.9.0.0
callStack :: HasCallStack => CallStack Source #
withFrozenCallStack :: HasCallStack => ( HasCallStack => a) -> a Source #
Perform some computation without adding new entries to the
CallStack
.
Since: base-4.9.0.0