BowenFu/hspp

Implement try

BowenFu opened this issue · 6 comments

try :: Exception e => IO a -> IO (Either e a)

Implement throw_, throwIO, and
onException io what
= io catch \e -> do _ <- what
throwIO (e :: SomeException)

data Async a = Async (MVar (Either SomeException a)) --
async :: IO a -> IO (Async a) async action = do
var <- newEmptyMVar
forkIO (do r <- try action; putMVar var r) -- return (Async var)
waitCatch :: Async a -> IO (Either SomeException a) -- waitCatch (Async var) = readMVar var
wait :: Async a -> IO a -- wait a = do
r <- waitCatch a case r of
Left e -> throwIO e
Right a -> return a

bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c bracket before after during = do
a <- before
c <- during a onException after a after a
return c

finally :: IO a -> IO b -> IO a finally io after = do
io onException after after

waitEither :: Async a -> Async b -> IO (Either a b) waitEither a b = do
m <- newEmptyMVar
forkIO $ do r <- try (fmap Left (wait a)); putMVar m r forkIO $ do r <- try (fmap Right (wait b)); putMVar m r wait (Async m)

waitAny :: [Async a] -> IO a waitAny as = do
m <- newEmptyMVar
let forkwait a = forkIO $ do r <- try (wait a); putMVar m r mapM_ forkwait as
wait (Async m)

Either has been implemented now.