mapIterable = (baseIterable, func) =>
  /** @type {Iterable<U>} */
  Far('mapped iterable', {
    [Symbol.iterator]: () => {
      const baseIterator = baseIterable[Symbol.iterator]();
      return Far('mapped iterator', {
        next: () => {
          const { value: baseValue, done } = baseIterator.next();
          const value = done ? baseValue : func(baseValue);
          return harden({ value, done });
        },
      });
    },
  })
The result iterator has as many elements as the `baseIterator` and
have the same termination -- the same completion value or failure
reason. But the non-final values are the corresponding non-final
values from `baseIterator` as transformed by `func`.

@template T,U
@param {Iterable<T>} baseIterable
@param {(value: T) => U} func
@returns {Iterable<U>}