code: public static <T, V> ChannelSupplier<V> remap(ChannelSupplier<T> supplier, Function<? super T, ? extends Iterator<? extends V>> fn) {
  		return new AbstractChannelSupplier<V>(supplier) {
  			Iterator<? extends V> iterator = CollectionUtils.emptyIterator();
  			boolean endOfStream;
  
  			@Override
  			protected Promise<V> doGet() {
  				if (iterator.hasNext()) return Promise.of(iterator.next());
  				return Promise.ofCallback(this::next);
  			}
  
  			private void next(SettableCallback<V> cb) {
  				if (!endOfStream) {
  					supplier.get()
  							.whenComplete((item, e) -> {
  								if (e == null) {
  									if (item == null) endOfStream = true;
  									iterator = fn.apply(item);
  									if (iterator.hasNext()) {
  										cb.set(iterator.next());
  									} else {
  										next(cb);
  									}
  								} else {
  									cb.setException(e);
  								}
  							});
  				} else {
  					cb.set(null);
  				}
  			}
  		};
  	}
docs: Transforms this {@code ChannelSupplier} data of <T> type with provided {@code fn},
  which returns an {@link Iterator} of a <V> type. Then provides this value to ChannelSupplier of <V>.