code: public final <K, V> Ix<GroupedIx<K, V>> groupBy(IxFunction<? super T, ? extends K> keySelector,
              IxFunction<? super T, ? extends V> valueSelector) {
          return new IxGroupBy<T, K, V>(this, nullCheck(keySelector, "keySelector is null"), nullCheck(valueSelector, "valueSelector is null"));
      }
docs: Groups mapped elements (by the valueSelector) of this sequence into distinct groups
  keyed by the keys returned by the keySelector.
  <p>
  The operator doesn't lose data and calling hasNext/next on either the returned Ix or on the inner
  GroupedIx can move the source sequence forward.
  <p>
  The result's iterator() and the inner groups' Iterators don't support remove().
  @param <K> the key type
  @param <V> the value type
  @param keySelector the function receiving the current element and returns the key to be used for
  grouping the values into the same inner GroupedIx.
  @param valueSelector the function receiving the current element and returns the value to be emitted
  by the appropriate group
  @return the new Ix instance
  @throws NullPointerException if keySelector or valueSelector is null
  @since 1.0
  @see #groupBy(IxFunction, IxFunction)