docs: public Iterable<Result<DeleteError>> removeObjects(final String bucketName, final Iterable<String> objectNames) {
      return new Iterable<Result<DeleteError>>() {
        @Override
        public Iterator<Result<DeleteError>> iterator() {
          return new Iterator<Result<DeleteError>>() {
            private Result<DeleteError> error;
            private Iterator<DeleteError> errorIterator;
            private boolean completed = false;
            private Iterator<String> objectNameIter = objectNames.iterator();
  
            private synchronized void populate() {
              List<DeleteError> errorList = null;
              try {
                List<DeleteObject> objectList = new LinkedList<DeleteObject>();
                int i = 0;
                while (objectNameIter.hasNext() && i < 1000) {
                  objectList.add(new DeleteObject(objectNameIter.next()));
                  i++;
                }
  
                if (i > 0) {
                  errorList = removeObject(bucketName, objectList);
                }
              } catch (InvalidBucketNameException | NoSuchAlgorithmException | InsufficientDataException | IOException
                       | InvalidKeyException | NoResponseException | XmlPullParserException | ErrorResponseException
                       | InternalException e) {
                this.error = new Result<>(null, e);
              } finally {
                if (errorList != null) {
                  this.errorIterator = errorList.iterator();
                } else {
                  this.errorIterator = new LinkedList<DeleteError>().iterator();
                }
              }
            }
  
            @Override
            public boolean hasNext() {
              if (this.completed) {
                return false;
              }
  
              if (this.error == null && this.errorIterator == null) {
                populate();
              }
  
              if (this.error == null && this.errorIterator != null && !this.errorIterator.hasNext()) {
                populate();
              }
  
              if (this.error != null) {
                return true;
              }
  
              if (this.errorIterator.hasNext()) {
                return true;
              }
  
              this.completed = true;
              return false;
            }
  
            @Override
            public Result<DeleteError> next() {
              if (this.completed) {
                throw new NoSuchElementException();
              }
  
              if (this.error == null && this.errorIterator == null) {
                populate();
              }
  
              if (this.error == null && this.errorIterator != null && !this.errorIterator.hasNext()) {
                populate();
              }
  
              if (this.error != null) {
                this.completed = true;
                return this.error;
              }
  
              if (this.errorIterator.hasNext()) {
                return new Result<>(this.errorIterator.next(), null);
              }
  
              this.completed = true;
              throw new NoSuchElementException();
            }
  
            @Override
            public void remove() {
              throw new UnsupportedOperationException();
            }
          };
        }
      };
    }