anchor.diff:  ----
   inject(1,[2,3,[4,5,[6]]])
   inject(1,[2,3,[4,5,[6]]]).unfold()
  -inject(1,[2,3,[4,5,[6]]]).repeat(unfold()).until {!(it.get() instanceof List)}
  +inject(1,[2,3,[4,5,[6]]]).repeat(unfold()).until(unfold().count().is(1l)).unfold()
   ----
   
   [[union-step]]
  
positive.code: ----
  g.V(1).repeat(out()).until(hasLabel('software')).path().by('name') <1>
  g.V(1).emit(hasLabel('person')).repeat(out()).path().by('name') <2>
  g.V(1).repeat(out()).until(outE().count().retain(0L)).path().by('name') <3>
  g.V(1).repeat(out()).until {!it.get().outE().hasNext()}.path().by('name') <4>
  ----
  
  <1> Starting from vertex 1, keep taking outgoing edges until a software vertex is reached.
  <2> Starting from vertex 1, and in an infinite loop, emit the vertex if it is a person and then traverser the outgoing edges.
  <3> Starting from vertex 1, keep taking outgoing edges until a vertex is reached that has no more outgoing edges.
  <4> The same as before, but using a predicate argument for `until()`.
  
  WARNING: The anonymous traversal of `emit()` and `until()` (not `repeat()`) process their current objects "locally." In OLAP, where the atomic unit of computing is the the vertex and its local "star graph," it is important that the anonymous traversals do not leave the confines of the vertex's star graph. In other words, they can not traverse to an adjacent vertex's properties or edges.
  
  
negative.code: 
  [gremlin-groovy,modern]
  ----
  g.V().group().by(label()) <1>
  g.V().group().by(label()).by('name') <2>
  g.V().group().by(label()).by('name').by(unfold().count()) <3>
  ----
  
  <1> Group the vertices by their label.
  <2> For each vertex in the group, get their name.
  <3> For each grouping, what is its size?
  
  The three projection parameters available to `group()` via `by()` are:
  
  