summaryrefslogtreecommitdiff
path: root/src/Run
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2023-01-12 22:45:48 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2023-01-12 22:45:48 +0100
commit20a18716e494d7d83d498cfc4bfd96fa11d6b8ce (patch)
treed1053839aa04bc322665dec3d94fbabe451450e2 /src/Run
parent1dbecf00a663c8d381abea31c1d317447aa9fb65 (diff)
Move process-related functions to Process module
Diffstat (limited to 'src/Run')
-rw-r--r--src/Run/Monad.hs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/Run/Monad.hs b/src/Run/Monad.hs
index 220ac46..221f6d7 100644
--- a/src/Run/Monad.hs
+++ b/src/Run/Monad.hs
@@ -4,6 +4,9 @@ module Run.Monad (
TestState(..),
TestOptions(..), defaultTestOptions,
Failed(..),
+
+ finally,
+ forkTest,
) where
import Control.Concurrent
@@ -87,3 +90,18 @@ instance MonadEval TestRun where
instance MonadOutput TestRun where
getOutput = asks $ teOutput . fst
+
+
+finally :: MonadError e m => m a -> m b -> m a
+finally act handler = do
+ x <- act `catchError` \e -> handler >> throwError e
+ void handler
+ return x
+
+forkTest :: TestRun () -> TestRun ()
+forkTest act = do
+ tenv <- ask
+ void $ liftIO $ forkIO $ do
+ runExceptT (flip runReaderT tenv $ fromTestRun act) >>= \case
+ Left e -> atomically $ writeTVar (teFailed $ fst tenv) (Just e)
+ Right () -> return ()