code: @Override
      public boolean hasNext() {
          if (throwable != null)
              throw throwable;
  
          try {
              if (hasDepleted.get())
                  return false;
  
              if (nextElement != null && nextElement != terminator) {
                  return true;
              } else if (nextElement == terminator)
                  return false;
  
  
              nextElement = buffer.take();
  
              if (nextElement == terminator) {
                  hasDepleted.set(true);
                  return false;
              }
  
              return true;
          } catch (Exception e) {
              log.error("Premature end of loop!");
              throw new RuntimeException(e);
          }
      }
docs: Returns {@code true} if the iteration has more elements.
  (In other words, returns {@code true} if {@link #next} would
  return an element rather than throwing an exception.)
  
  @return {@code true} if the iteration has more elements