summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2014-08-19 20:54:12 +0100
committerDominik Picheta <dominikpicheta@googlemail.com>2014-08-19 20:54:12 +0100
commita0b2fb5bd7e4fa1578800851cec9736fc30e6ef1 (patch)
tree0ca2fa5bc5c046781ece616b7cb5913c3d9812e0
parent9c0d25dc942d59a88ffcdcc464362ffb70c13ec2 (diff)
downloadNim-a0b2fb5bd7e4fa1578800851cec9736fc30e6ef1.tar.gz
Implements `or` and `and` for futures. Ref #1487.
-rw-r--r--lib/pure/asyncdispatch.nim21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim
index 5597acf6f..5dfcf4656 100644
--- a/lib/pure/asyncdispatch.nim
+++ b/lib/pure/asyncdispatch.nim
@@ -180,6 +180,27 @@ proc asyncCheck*[T](future: PFuture[T]) =
         echoOriginalStackTrace(future)
         raise future.error
 
+proc `and`*[T, Y](fut1: PFuture[T], fut2: PFuture[Y]): PFuture[void] =
+  ## Returns a future which will complete once both ``fut1`` and ``fut2``
+  ## complete.
+  var retFuture = newFuture[void]()
+  fut1.callback =
+    proc () =
+      if fut2.finished: retFuture.complete()
+  fut2.callback =
+    proc () =
+      if fut1.finished: retFuture.complete()
+  return retFuture
+
+proc `or`*[T, Y](fut1: PFuture[T], fut2: PFuture[Y]): PFuture[void] =
+  ## Returns a future which will complete once either ``fut1`` or ``fut2``
+  ## complete.
+  var retFuture = newFuture[void]()
+  proc cb() =
+    if not retFuture.finished: retFuture.complete()
+  fut1.callback = cb
+  fut2.callback = cb
+
 type
   PDispatcherBase = ref object of PObject
     timers: seq[tuple[finishAt: float, fut: PFuture[void]]]