public Cursor cursor(final int[] start, final int[] end) {
		if (!contains(start)) {
			throw new IllegalArgumentException(
				"Start set %s not in %s."
					.formatted(Arrays.toString(start), this)
			);
		}
		if (!contains(end)) {
			throw new IllegalArgumentException(
				"End set %s not in %s."
					.formatted(Arrays.toString(start), this)
			);
		}
		if (compare(start, end) > 0) {
			throw new IllegalArgumentException(
				"Start must be smaller or equal to end: %s > %s."
					.formatted(Arrays.toString(start), Arrays.toString(end))
			);
		}

		if (compare(end, end()) == 0) {
			if (compare(start, start()) == 0) {
				return cursor();
			} else {
				return cursor(start);
			}
		}

		return new Cursor() {
			final int[] next = start.clone();
			final long size = rank(end) - rank(start) + 1;
			long pos = 0;

			@Override
			public boolean next(int[] index) {
				if (pos < size) {
					System.arraycopy(next, 0, index, 0, k);
					++pos;
					return true;
				} else {
					return false;
				}
			}

			@Override
			public int size() {
				return k;
			}
		};
	}
Return a cursor which lets you iterate over all k-subsets, starting from
the given {@code start} element.

@param start the start element, inclusively
@return a cursor from the given {@code start} element
@throws IllegalArgumentException if {@code start} is not part of
        {@code this} k-subset
jenetics.incubator/src/main/java/io/jenetics/incubator/combinatorial/KSubset.java