{-# LANGUAGE TemplateHaskell #-} module Main where { import Data.OpenWitness.ST; import Data.OpenWitness.Exception; import Unsafe; import Prelude hiding (catch); stuff :: ST s [Int]; stuff = do { ra <- newSTRef 3; a1 <- readSTRef ra; rb <- newSTRef 4; b1 <- readSTRef rb; writeSTRef ra 5; a2 <- readSTRef ra; writeSTRef rb 7; b2 <- readSTRef rb; return [a1,b1,a2,b2]; }; intExn :: Exn Int; intExn = $(declexn [t|Int|]); stringExn :: Exn String; stringExn = $(declexn [t|String|]); showCatch :: IO a -> IO (); showCatch f = ((do { _ <- f; putStrLn "not caught"; } `catch` intExn) (\i -> putStrLn ("caught intExn " ++ (show i))) `catch` stringExn) (\s -> putStrLn ("caught stringExn " ++ (show s))); main :: IO (); main = do { putStrLn (show (runST stuff)); putStrLn (show (coerce 'A' :: Int)); showCatch (return "hello"); showCatch (throw intExn 3); showCatch (throw stringExn "text"); showCatch (throw intExn 67); showCatch (throw stringExn "str"); }; }