@@ -19,7 +19,7 @@ import Control.Monad.Error.Class (throwError, catchError)
19
19
import Control.Parallel (parallel , sequential , parTraverse_ )
20
20
import Data.Array as Array
21
21
import Data.Bifunctor (lmap )
22
- import Data.Either (Either (..), isLeft , isRight )
22
+ import Data.Either (Either (..), either , isLeft , isRight )
23
23
import Data.Foldable (sum )
24
24
import Data.Maybe (Maybe (..))
25
25
import Data.Monoid (mempty )
@@ -64,6 +64,11 @@ assertEq s a aff = liftEff <<< assertEff s <<< map (eq a) =<< try aff
64
64
assert ∷ ∀ eff . String → TestAff eff Boolean → TestAff eff Unit
65
65
assert s aff = liftEff <<< assertEff s =<< try aff
66
66
67
+ withTimeout ∷ ∀ eff a . Milliseconds → TestAff eff a → TestAff eff a
68
+ withTimeout ms aff =
69
+ either throwError pure =<< sequential do
70
+ parallel (try aff) <|> parallel (delay ms $> Left (error " Timed out" ))
71
+
67
72
test_pure ∷ ∀ eff . TestEff eff Unit
68
73
test_pure = runAssertEq " pure" 42 (pure 42 )
69
74
@@ -411,6 +416,21 @@ test_parallel = assert "parallel" do
411
416
r2 ← joinFiber f1
412
417
pure (r1 == " foobar" && r2.a == " foo" && r2.b == " bar" )
413
418
419
+ test_parallel_throw ∷ ∀ eff . TestAff eff Unit
420
+ test_parallel_throw = assert " parallel/throw" $ withTimeout (Milliseconds 100.0 ) do
421
+ ref ← newRef " "
422
+ let
423
+ action n s = do
424
+ delay (Milliseconds n)
425
+ modifyRef ref (_ <> s)
426
+ pure s
427
+ r1 ← try $ sequential $
428
+ { a: _, b: _ }
429
+ <$> parallel (action 10.0 " foo" *> throwError (error " Nope" ))
430
+ <*> parallel never
431
+ r2 ← readRef ref
432
+ pure (isLeft r1 && r2 == " foo" )
433
+
414
434
test_kill_parallel ∷ ∀ eff . TestAff eff Unit
415
435
test_kill_parallel = assert " kill/parallel" do
416
436
ref ← newRef " "
@@ -641,6 +661,7 @@ main = do
641
661
test_kill_finalizer_catch
642
662
test_kill_finalizer_bracket
643
663
test_parallel
664
+ test_parallel_throw
644
665
test_kill_parallel
645
666
test_parallel_alt
646
667
test_parallel_alt_throw
0 commit comments