code: func (it *And) Next(ctx context.Context) bool {
  	graph.NextLogIn(it)
  	it.runstats.Next += 1
  	for it.primaryIt.Next(ctx) {
  		curr := it.primaryIt.Result()
  		if it.subItsContain(ctx, curr, nil) {
  			it.result = curr
  			return graph.NextLogOut(it, true)
  		}
  	}
  	it.err = it.primaryIt.Err()
  	return graph.NextLogOut(it, false)
  }
docs: // Returns advances the And iterator. Because the And is the intersection of its
  // subiterators, it must choose one subiterator to produce a candidate, and check
  // this value against the subiterators. A productive choice of primary iterator
  // is therefore very important.