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())