-- $Id: except.ghc,v 1.2 2001/05/20 00:21:36 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- from Simon Marlow
import System
import Exception
import IOExts
blowup n | even n = throw (ErrorCall "H")
| otherwise = throw (ErrorCall "L")
lo_function lo n =
Exception.catchAllIO (blowup n)
(\ex -> case ex of
ErrorCall "L" -> do nlo <- readIORef lo
writeIORef lo (nlo + 1)
_ -> throw ex
)
hi_function hi lo n =
Exception.catchAllIO (lo_function lo n)
(\ex -> case ex of
ErrorCall "H" -> do nhi <- readIORef hi
writeIORef hi (nhi + 1)
_ -> throw ex
)
some_function hi lo n = hi_function hi lo n
main = do
[arg] <- getArgs
let n = read arg :: Int
hi <- newIORef (0 :: Int)
lo <- newIORef (0 :: Int)
mapM (some_function hi lo) [n,n-1..1]
nhi <- readIORef hi
nlo <- readIORef lo
putStrLn ("Exceptions: HI=" ++ show nhi ++ " / LO=" ++ show nlo)