@@ -19,7 +19,7 @@ import Control.Monad.Error.Class (throwError, catchError)
1919import Control.Parallel (parallel , sequential , parTraverse_ )
2020import Data.Array as Array
2121import Data.Bifunctor (lmap )
22- import Data.Either (Either (..), isLeft , isRight )
22+ import Data.Either (Either (..), either , isLeft , isRight )
2323import Data.Foldable (sum )
2424import Data.Maybe (Maybe (..))
2525import Data.Monoid (mempty )
@@ -64,6 +64,11 @@ assertEq s a aff = liftEff <<< assertEff s <<< map (eq a) =<< try aff
6464assert ∷ ∀ eff . String → TestAff eff Boolean → TestAff eff Unit
6565assert s aff = liftEff <<< assertEff s =<< try aff
6666
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+
6772test_pure ∷ ∀ eff . TestEff eff Unit
6873test_pure = runAssertEq " pure" 42 (pure 42 )
6974
@@ -411,6 +416,21 @@ test_parallel = assert "parallel" do
411416 r2 ← joinFiber f1
412417 pure (r1 == " foobar" && r2.a == " foo" && r2.b == " bar" )
413418
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+
414434test_kill_parallel ∷ ∀ eff . TestAff eff Unit
415435test_kill_parallel = assert " kill/parallel" do
416436 ref ← newRef " "
@@ -641,6 +661,7 @@ main = do
641661 test_kill_finalizer_catch
642662 test_kill_finalizer_bracket
643663 test_parallel
664+ test_parallel_throw
644665 test_kill_parallel
645666 test_parallel_alt
646667 test_parallel_alt_throw
0 commit comments