hspp icon indicating copy to clipboard operation
hspp copied to clipboard

Implement try

Open BowenFu opened this issue 3 years ago • 6 comments

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

BowenFu avatar Aug 08 '22 15:08 BowenFu

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

BowenFu avatar Aug 08 '22 15:08 BowenFu

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

BowenFu avatar Aug 08 '22 15:08 BowenFu

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

BowenFu avatar Aug 08 '22 15:08 BowenFu

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)

BowenFu avatar Aug 08 '22 15:08 BowenFu

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)

BowenFu avatar Aug 08 '22 15:08 BowenFu

Either has been implemented now.

BowenFu avatar Sep 11 '22 09:09 BowenFu