def zip(other) # rubocop: disable Metrics/MethodLength
      promise = Promise.new(@options)
      on_complete_match do |m|
        m.success do |value|
          other.on_complete do |other_try|
            promise.complete!(other_try.map { |other_value| [value, other_value] })
          end
        end
        m.failure do |error|
          promise.failure!(error)
        end
      end

      promise.to_future
    end
def zip(other) # rubocop: disable Metrics/MethodLength
      promise = Promise.new(@options)
      on_complete_match do |m|
        m.success do |value|
          other.on_complete do |other_try|
            promise.complete!(other_try.map { |other_value| [value, other_value] })
          end
        end
        m.failure do |error|
          promise.failure!(error)
        end
      end

      promise.to_future
    end
Zips the values of +self+ and +other+ future, and creates
 a new future holding the array of their results.

 If +self+ future fails, the resulting future is failed
 with the error stored in +self+.
 Otherwise, if +other+ future fails, the resulting future is failed
 with the error stored in +other+.

 @param other [Fear::Future]
 @return [Fear::Future]

 @example
   future1 = Fear.future { call_service1 }
   future1 = Fear.future { call_service2 }
   future1.zip(future2) #=> returns the same result as Fear.future { [call_service1, call_service2] },
     # but it performs two calls asynchronously