LambdaHack-0.2.10: A roguelike game engine in early and active development

Safe HaskellNone

Game.LambdaHack.Utils.Assert

Description

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.

Synopsis

Documentation

assert :: Bool -> a -> a

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])

skip :: Monad m => m ()

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.