 /// - parameter accumulated: the accumulated value up to this element of the `Collection`
 /// - parameter element: a new element to be accumulated
 
-public func reduce<S: Sequence, T, U>(qos: DispatchQoS,
-                                      deferreds: S, initial: U,
-                                      combine: @escaping (_ accumulated: U, _ element: T) throws -> U) -> Deferred<U>
-  where S.Element == Deferred<T>
+public func reduce<S: Sequence, T, F, U>(qos: DispatchQoS,
+                                         deferreds: S, initial: U,
+                                         combine: @escaping (_ accumulated: U, _ element: T) -> U) -> Deferred<U, F>
+  where S.Element == Deferred<T, F>
 {
   let queue = DispatchQueue(label: "reduce-sequence", qos: qos)
   return reduce(queue: queue, deferreds: deferreds, initial: initial, combine: combine)

/// - parameter accumulated: the accumulated value up to this element of the `Collection`
/// - parameter element: a new element to be accumulated

public func reduce<S: Sequence, T, U>(_ deferreds: S, initial: U,
                                      combine: @escaping (_ accumulated: U, _ element: T) throws -> U) -> Deferred<U>
  where S.Element == Deferred<T>
{
  return reduce(qos: .current, deferreds: deferreds, initial: initial, combine: combine)
}

/// - parameter accumulated: the accumulated value up to this element of the `Collection`
/// - parameter element: a new element to be accumulated

public func reduce<C: Collection, T, F, U>(qos: DispatchQoS,
                                           deferreds: C, initial: U,
                                           combine: @escaping (_ accumulated: U, _ element: T) -> U) -> Deferred<U, F>
  where C.Element == Deferred<T, F>
{
  let queue = DispatchQueue(label: "reduce-collection", qos: qos)
  return reduce(queue: queue, deferreds: deferreds, initial: initial, combine: combine)
