docs: public Iterator breadthFirst() {
          return new Iterator() {
              private final List list = new LinkedList();
              private Iterator iter = iterator();
              private GPathResult next = getNextByBreadth();
  
              public boolean hasNext() {
                  return this.next != null;
              }
  
              public Object next() {
                  try {
                      return this.next;
                  } finally {
                      this.next = getNextByBreadth();
                  }
              }
  
              public void remove() {
                  throw new UnsupportedOperationException();
              }
  
              private GPathResult getNextByBreadth() {
                  List children = new ArrayList();
                  while (this.iter.hasNext() || !children.isEmpty()) {
                      if (this.iter.hasNext()) {
                          final GPathResult node = (GPathResult) this.iter.next();
                          this.list.add(node);
                          this.list.add(this.iter);
                          children.add(node.children());
                      } else {
                          List nextLevel = new ArrayList();
                          for (Object child : children) {
                              GPathResult next = (GPathResult) child;
                              Iterator iterator = next.iterator();
                              while (iterator.hasNext()) {
                                  nextLevel.add(iterator.next());
                              }
                          }
                          this.iter = nextLevel.iterator();
                          children = new ArrayList();
                      }
                  }
                  if (this.list.isEmpty()) {
                      return null;
                  } else {
                      GPathResult result = (GPathResult) this.list.get(0);
                      this.list.remove(0);
                      this.iter = (Iterator) this.list.get(0);
                      this.list.remove(0);
                      return result;
                  }
              }
          };
      }