code: public <R> Choice<R> thenChoose(final Function<? super T, Choice<R>> function) {
      checkNotNull(function);
      if (Thread.interrupted()) {
        throw new RuntimeException(new InterruptedException());
      }
      final Choice<T> thisChoice = this;
      return new Choice<R>() {
        @Override
        protected Iterator<R> iterator() {
          if (Thread.interrupted()) {
            throw new RuntimeException(new InterruptedException());
          }
          return Iterators.concat(
              Iterators.transform(thisChoice.iterator(), (T t) -> function.apply(t).iterator()));
        }
      };
    }
docs: Returns all the choices obtained by choosing from this {@code Choice} and then choosing from
  the {@code Choice} yielded by this function on the result.
  
  <p>The function may be applied lazily or immediately, at the discretion of the implementation.
  
  <p>This is the monadic bind for {@code Choice}.