code: private function promiseReduce(array $values, callable $callback, $initialValue)
      {
          return array_reduce(
              $values,
              function ($previous, $value) use ($callback) {
                  $promise = $this->getPromise($previous);
                  if ($promise) {
                      return $promise->then(static function ($resolved) use ($callback, $value) {
                          return $callback($resolved, $value);
                      });
                  }
  
                  return $callback($previous, $value);
              },
              $initialValue
          );
      }
docs: Similar to array_reduce(), however the reducing callback may return
  a Promise, in which case reduction will continue after each promise resolves.
  
  If the callback does not return a Promise, then this function will also not
  return a Promise.
  
  @param mixed[]            $values
  @param Promise|mixed|null $initialValue
  
  @return mixed[]