diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-08-19 20:54:12 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-08-19 20:54:12 +0100 |
commit | a0b2fb5bd7e4fa1578800851cec9736fc30e6ef1 (patch) | |
tree | 0ca2fa5bc5c046781ece616b7cb5913c3d9812e0 /lib | |
parent | 9c0d25dc942d59a88ffcdcc464362ffb70c13ec2 (diff) | |
download | Nim-a0b2fb5bd7e4fa1578800851cec9736fc30e6ef1.tar.gz |
Implements `or` and `and` for futures. Ref #1487.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/asyncdispatch.nim | 21 |
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]]] |