module Utils where import Control.Concurrent import Control.Exception forkWait :: IO a -> IO (IO a) forkWait :: forall a. IO a -> IO (IO a) forkWait IO a a = do res <- IO (MVar (Either SomeException a)) forall a. IO (MVar a) newEmptyMVar _ <- mask $ \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 a b. IO a -> (a -> IO b) -> IO b 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 return (takeMVar res >>= either (\SomeException ex -> SomeException -> IO a forall e a. (HasCallStack, Exception e) => e -> IO a throwIO (SomeException ex :: SomeException)) return)