code: public Iterator<ResidueNumber> iterator(final AtomPositionMap map) {
  		//Use Entries to guarentee not null
  		final Iterator<Entry<ResidueNumber, Integer>> entryIt = map.getNavMap().entrySet().iterator();
  		if(! entryIt.hasNext()) {
  			// empty iterator
  			return Arrays.asList(new ResidueNumber[0]).iterator();
  		}
  		// Peek at upcoming entry
  
  		return new Iterator<ResidueNumber>() {
  			Entry<ResidueNumber,Integer> next = loadNext();
  
  			private Entry<ResidueNumber,Integer> loadNext() {
  
  				while( entryIt.hasNext() ) {
  					next = entryIt.next();
  					ResidueNumber nextPos = next.getKey();
  					if( contains(nextPos, map)) {
  						// loaded a valid next value
  						return next;
  					}
  				}
  				next = null;
  				return next;
  			}
  
  			@Override
  			public boolean hasNext() {
  				return next != null;
  			}
  
  			@Override
  			public ResidueNumber next() {
  				if(!hasNext()){
  					throw new NoSuchElementException();
  				}
  				ResidueNumber pos = next.getKey();
  				loadNext();
  				return pos;
  			}
  
  			@Override
  			public void remove() {
  				throw new UnsupportedOperationException("Not modifiable");
  			}
  		};
  	}
docs: Returns a new Iterator over every {@link ResidueNumber} in this ResidueRange.
  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.