content: module Main where
  
  import Control.Exception
  import System.IO.Error
  
  main = do
    ioTest
    errorTest
    noMethodTest
    patMatchTest
    guardTest
  
  ioTest :: IO ()
  ioTest = catchJust (\e -> if isUserError e then Just () else Nothing)
                     (ioError (userError "wibble"))
                     (\() -> putStrLn "user exception caught")
  
  errorTest :: IO ()
  errorTest = do r <- try (evaluate (1 + error "call to 'error'"))
                 case r of
                     Left (ErrorCall _) -> putStrLn "error call caught"
                     Right _            -> error "help!"
  
  instance (Show a, Eq a) => Num (Maybe a) where {}
  
  noMethodTest :: IO ()
  noMethodTest = do r <- try (evaluate (Just () + Just ()))
                    case r of
                        Left (NoMethodError err) -> putStrLn "no method error"
                        Right _                  -> error "help!"
  
  patMatchTest :: IO ()
  patMatchTest = catch (case test1 [1..10] of () -> return ())
    (\ex -> case ex of
            PatternMatchFail err -> putStr err
            _                    -> error "help!")
  
  test1 [] = ()
  
  guardTest = catch (case test2 of () -> return ())
                    (\ex -> case ex of
                            PatternMatchFail err -> putStr err
                            _                    -> error "help!")
  
  test2 | all (==0) [1] = ()
  
  