code: @Override
      public Iterator<int[]> iterator() {
          return new Iterator<int[]>() {
              Iterator<int[]> unsafe = fastPassByReferenceIterator();
              @Override
              public boolean hasNext() {
                  return unsafe.hasNext();
              }
  
              @Override
              public int[] next() {
                  return unsafe.next().clone();
              }
          };
      }
docs: WARNING: This is pass by reference to avoid massive GC overload during heavy iterations, and because the standard
  use case is to use the assignments array as an accessor. Please, clone if you save a copy, otherwise the array
  will mutate underneath you.
  
  @return an iterator over all possible assignments to this factor