From 4a9dd62974f7abdcbcc158dcb0a54bebbd0a9235 Mon Sep 17 00:00:00 2001 From: Russell Stephens Date: Thu, 5 May 2016 10:26:00 -0400 Subject: [PATCH] Adding when for blocking on 2 and 3 promises --- Promises/Promise.swift | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Promises/Promise.swift b/Promises/Promise.swift index 383f085..766007c 100644 --- a/Promises/Promise.swift +++ b/Promises/Promise.swift @@ -343,6 +343,54 @@ public func when(promises: Promise...) -> Promise<[V]> { return when(promises) } +public func when(t: Promise, _ u: Promise) -> Promise<(T, U)> { + var tValue: T? + var uValue: U? + + return promise { resolve, reject in + var counter: Int32 = 2 + t.error(reject).then { + tValue = $0 + if 0 == OSAtomicDecrement32(&counter) { + resolve((tValue!, uValue!)) + } + } + u.error(reject).then { + uValue = $0 + if 0 == OSAtomicDecrement32(&counter) { + resolve((tValue!, uValue!)) + } + } + } +} + +public func when(t: Promise, _ u: Promise, _ v: Promise) -> Promise<(T, U, V)> { + var tValue: T? + var uValue: U? + var vValue: V? + let promiseCount: Int32 = 3 + return promise { resolve, reject in + var counter: Int32 = promiseCount + t.error(reject).then { + tValue = $0 + if 0 == OSAtomicDecrement32(&counter) { + resolve((tValue!, uValue!, vValue!)) + } + } + u.error(reject).then { + uValue = $0 + if 0 == OSAtomicDecrement32(&counter) { + resolve((tValue!, uValue!, vValue!)) + } + } + v.error(reject).then { + vValue = $0 + if 0 == OSAtomicDecrement32(&counter) { + resolve((tValue!, uValue!, vValue!)) + } + } + } +} public func first(promises: [Promise]) -> Promise { let p = Promise(Queue().suspend())