Safe Haskell | None |
---|
Tools for specifying assertions. A step towards contracts.
Actually, a bunch of hacks wrapping the original assert
function,
which is the only easy way of obtaining source positions.
Documentation
If the first argument evaluates to True
, then the result is the
second argument. Otherwise an AssertionFailed
exception is raised,
containing a String
with the source file and line number of the
call to assert
.
Assertions can normally be turned on or off with a compiler flag
(for GHC, assertions are normally on unless optimisation is turned on
with -O
or the -fignore-asserts
option is given). When assertions are turned off, the first
argument to assert
is ignored, and the second argument is
returned as the result.
blame :: Show a => Bool -> a -> Bool
If the condition fails, display the value blamed for the failure. Used as in
assert (c /= 0 `blame` c) $ 10 / c
with :: Text -> b -> (Text, b)
failure :: Show a => (Bool -> b -> b) -> a -> b
Like error
, but shows the source position and also
the value to blame for the failure. To be used as in:
assert `failure` ((x1, y1), (x2, y2), "designate a vertical line")
allB :: Show a => (a -> Bool) -> [a] -> Bool
Like all
, but if the predicate fails, blame all the list elements
and especially those for which it fails. To be used as in:
assert (allB (>= 0) [yf, xf, y1, x1, y2, x2])
To be used in place of the verbose skip
, as in:
do b <- getB a assert (b `blame` a) skip
forceEither :: Show a => Either a b -> b
In case of corruption, just fail and show the error message.