From a29f8df5bb76d24c9ac5d8ed8b8282968111cf4c Mon Sep 17 00:00:00 2001 From: Konstantin Molchanov Date: Wed, 1 Jun 2016 00:54:49 +0400 Subject: [PATCH] stdlib: asyncdispatch: `all`: Tests now pass; import sequtils removed; Future[void] case optimized. --- lib/pure/asyncdispatch.nim | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 50349b1046..624836358c 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -9,7 +9,7 @@ include "system/inclrtl" -import os, oids, tables, strutils, macros, times, heapqueue, sequtils +import os, oids, tables, strutils, macros, times, heapqueue import nativesockets, net, queues @@ -363,7 +363,23 @@ proc all*[T](futs: varargs[Future[T]]): auto = ## in the order they are passed. when T is void: - return foldl(futs, a and b) + var + retFuture = newFuture[void]("asyncdispatch.all") + completedFutures = 0 + + let totalFutures = len(futs) + + for i, fut in futs: + proc setCallback(i: int) = + fut.callback = proc(f: Future[T]) = + inc(completedFutures) + + if completedFutures == totalFutures: + retFuture.complete() + + setCallback(i) + + return retFuture else: var