From f2bded180f1c5fcb0994bc7d86d6221cd9ba6504 Mon Sep 17 00:00:00 2001 From: Ruslan Mustakov Date: Wed, 2 Nov 2016 20:04:08 +0700 Subject: [PATCH] async all() now immediately completes if arg is empty --- lib/pure/includes/asyncfutures.nim | 7 +++++++ tests/async/tasyncall.nim | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/pure/includes/asyncfutures.nim b/lib/pure/includes/asyncfutures.nim index d78464a91a..dfcfa37a0c 100644 --- a/lib/pure/includes/asyncfutures.nim +++ b/lib/pure/includes/asyncfutures.nim @@ -246,6 +246,7 @@ proc `or`*[T, Y](fut1: Future[T], fut2: Future[Y]): Future[void] = proc all*[T](futs: varargs[Future[T]]): auto = ## Returns a future which will complete once ## all futures in ``futs`` complete. + ## If the argument is empty, the returned future completes immediately. ## ## If the awaited futures are not ``Future[void]``, the returned future ## will hold the values of all awaited futures in a sequence. @@ -270,6 +271,9 @@ proc all*[T](futs: varargs[Future[T]]): auto = if completedFutures == totalFutures: retFuture.complete() + if totalFutures == 0: + retFuture.complete() + return retFuture else: @@ -292,4 +296,7 @@ proc all*[T](futs: varargs[Future[T]]): auto = setCallback(i) + if retValues.len == 0: + retFuture.complete(retValues) + return retFuture diff --git a/tests/async/tasyncall.nim b/tests/async/tasyncall.nim index 60ba557ccd..63b2945a64 100644 --- a/tests/async/tasyncall.nim +++ b/tests/async/tasyncall.nim @@ -66,3 +66,12 @@ block: doAssert execTime * 100 < taskCount * sleepDuration doAssert results == expected + +block: + let + noIntFuturesFut = all(newSeq[Future[int]]()) + noVoidFuturesFut = all(newSeq[Future[void]]()) + + doAssert noIntFuturesFut.finished and not noIntFuturesFut.failed + doAssert noVoidFuturesFut.finished and not noVoidFuturesFut.failed + doAssert noIntFuturesFut.read() == @[]