module Utils where import Control.Concurrent import Control.Exception forkWait :: IO a -> IO (IO a) forkWait :: IO a -> IO (IO a) forkWait IO a a = do MVar (Either SomeException a) res <- IO (MVar (Either SomeException a)) forall a. IO (MVar a) newEmptyMVar ThreadId _ <- ((forall a. IO a -> IO a) -> IO ThreadId) -> IO ThreadId forall b. ((forall a. IO a -> IO a) -> IO b) -> IO b mask (((forall a. IO a -> IO a) -> IO ThreadId) -> IO ThreadId) -> ((forall a. IO a -> IO a) -> IO ThreadId) -> IO ThreadId forall a b. (a -> b) -> a -> b $ \forall a. IO a -> IO a restore -> IO () -> IO ThreadId forkIO (IO () -> IO ThreadId) -> IO () -> IO ThreadId forall a b. (a -> b) -> a -> b $ IO a -> IO (Either SomeException a) forall e a. Exception e => IO a -> IO (Either e a) try (IO a -> IO a forall a. IO a -> IO a restore IO a a) IO (Either SomeException a) -> (Either SomeException a -> IO ()) -> IO () forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= MVar (Either SomeException a) -> Either SomeException a -> IO () forall a. MVar a -> a -> IO () putMVar MVar (Either SomeException a) res IO a -> IO (IO a) forall (m :: * -> *) a. Monad m => a -> m a return (MVar (Either SomeException a) -> IO (Either SomeException a) forall a. MVar a -> IO a takeMVar MVar (Either SomeException a) res IO (Either SomeException a) -> (Either SomeException a -> IO a) -> IO a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (SomeException -> IO a) -> (a -> IO a) -> Either SomeException a -> IO a forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either (\SomeException ex -> SomeException -> IO a forall e a. Exception e => e -> IO a throwIO (SomeException ex :: SomeException)) a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return)