7 -- Begin Signature ----------------------------------------------------------
10 STEx synthesizes the state and exception monads.
16 {-instance Monad (STEx s)-}
17 {-instance MonadPlus (STEx s)-}
19 -- c `handle` x, return x if c raises an exception
20 handle :: STEx a b -> b -> ST a b
22 -- lift an exception or st monad thing or into STEx
23 liftEx :: Maybe a -> STEx s a
24 liftST :: ST s a -> STEx s a
26 -- raise an exception if Bool is False
27 assert :: Bool -> STEx s ()
29 -- the following functions have the same meaning as their corresponding
30 -- state monad functions
31 {-readVarSTEx :: MutVar a b -> STEx a b-}
32 {-writeVarSTEx :: MutVar a b -> b -> STEx a ()-}
33 {-newVarSTEx :: a -> STEx b (MutVar b a)-}
35 {-readArraySTEx :: Ix b => MutArr a b c -> b -> STEx a c-}
36 {-writeArraySTEx :: Ix b => MutArr a b c -> b -> c -> STEx a ()-}
37 {-newArraySTEx :: Ix a => (a,a) -> b -> STEx c (MutArr c a b)-}
39 -- End Signature -----------------------------------------------------------
41 newtype STEx s a = STEx (ST s (Maybe a))
43 instance Monad (STEx s) where
44 return = STEx . return . return
48 Just z -> let STEx z' = f z
50 Nothing -> return Nothing
52 instance MonadPlus (STEx s) where
54 (STEx x) `mplus` (STEx y) = STEx $ do x' <- x
57 liftST x = STEx $ do {z <- x ; return $ return z}
59 liftEx x = STEx $ return x
68 readVarSTEx v = liftST $ readSTRef v
69 writeVarSTEx v x = liftST $ writeSTRef v x
70 newVarSTEx x = liftST $ newSTRef x
72 readArraySTEx v n = liftST $ readSTArray v n
73 writeArraySTEx v x n = liftST $ writeSTArray v x n
74 newArraySTEx x n = liftST $ newSTArray x n
77 f x = do y <- liftEx x
81 g x = runST (handle (f x) 2)
84 assert True = liftEx $ Just ()
85 assert False = liftEx $ Nothing