diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2023-01-12 22:45:48 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2023-01-12 22:45:48 +0100 |
commit | 20a18716e494d7d83d498cfc4bfd96fa11d6b8ce (patch) | |
tree | d1053839aa04bc322665dec3d94fbabe451450e2 /src/Run | |
parent | 1dbecf00a663c8d381abea31c1d317447aa9fb65 (diff) |
Move process-related functions to Process module
Diffstat (limited to 'src/Run')
-rw-r--r-- | src/Run/Monad.hs | 18 |
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 () |