code: public static Iterator<ResidueNumber> multiIterator(final AtomPositionMap map, final ResidueRange... rrs) {
  		return new Iterator<ResidueNumber>() {
  			private int r = 0;
  			private Iterator<ResidueNumber> internal;
  			@Override
  			public boolean hasNext() {
  				if (r == rrs.length - 1) {
  					init();
  					return internal.hasNext();
  				}
  				return true;
  			}
  			private void init() {
  				if (internal == null) {
  					internal = rrs[r].iterator(map);
  				}
  			}
  			@Override
  			public ResidueNumber next() {
  				if (rrs.length == 0) throw new NoSuchElementException();
  				init();
  				if (!hasNext()) throw new NoSuchElementException();
  				if (!internal.hasNext()) {
  					r++;
  					internal = rrs[r].iterator(map);
  				}
  				return internal.next();
  			}
  			@Override
  			public void remove() {
  				throw new UnsupportedOperationException("Not modifiable");
  			}
  		};
  	}
docs: Returns a new Iterator over every {@link ResidueNumber} in the list of ResidueRanges.
  Stores the contents of {@code map} until the iterator is finished, so calling code should set the iterator to {@code null} if it did not finish.