Translate a KeyedTraversable of Awaitables into a single Awaitable of Map of key/ResultOrExceptionWrapper pairs

namespace HH\Asio;

function mw<Tk as arraykey, Tv>(
  KeyedTraversable<Tk, Awaitable<Tv>> $awaitables,
): Awaitable<Map<Tk, ResultOrExceptionWrapper<Tv>>>;

This function is the same as m(), but wraps the results into key/ResultOrExceptionWrapper pairs.

This function takes any KeyedTraversable object of Awaitables (i.e., each member of the KeyedTraversable has a value of type Awaitable, likely from a call to a function that returned Awaitable<T>), and transforms those Awaitables into one big Awaitable Map of key/ResultOrExceptionWrapper pairs.

This function is called mw because we are returning a map of Awaitable wrapped into ResultofExceptionWrappers.

The ResultOrExceptionWrapper values in the Map of the returned Awaitable are not available until you await or join the returned Awaitable.




async function one(): Awaitable<int> {
  return 1;

$mcr = \MCRouter::createSimple(ImmVector {});

$handles = \HH\Asio\mw(Map {
  // This will throw an exception, since there's no servers to speak to
  'cache' => $mcr->get("no-such-key"),

  // While this will obviously succeed
  'one' => one(),

$results = \HH\Asio\join($handles);
foreach ($results as $key => $result) {
  if ($result->isSucceeded()) {
    echo "$key Success: ";
  } else {
    echo "$key Failed: ";
cache Failed: string(38) "get failed with result mc_res_notfound"
one Success: int(1)