anchor.diff:  stream_inner(_, _, _, eof) -> ok.
   
   %% Chain a list of iterators into what looks like one single iterator.
  -build_group_iterator([Iterator|Iterators]) ->
  -    GroupIterator = build_group_iterator(Iterators),
  -    fun() -> group_iterator(Iterator(), GroupIterator()) end;
  -build_group_iterator([]) ->
  -    fun() -> eof end.
  +build_iterator_tree(Iterators) ->
  +    case build_iterator_tree_inner(Iterators) of
  +        [OneIterator] -> OneIterator;
  +        ManyIterators -> build_iterator_tree(ManyIterators)
  +    end.
  +build_iterator_tree_inner([]) ->
  +    [];
  +build_iterator_tree_inner([Iterator]) ->
  +    [Iterator];
  +build_iterator_tree_inner([IteratorA,IteratorB|Rest]) ->
  +    Iterator = fun() -> group_iterator(IteratorA(), IteratorB()) end,
  +    [Iterator|build_iterator_tree_inner(Rest)].
  +
   group_iterator(I1 = {Term1, Iterator1}, I2 = {Term2, Iterator2}) ->
       case compare_fun(Term1, Term2) of
           true ->
  
positive.code:         %% Create the group iterator...
          process_flag(priority, high),
          SegmentIterators = [mi_segment:iterator(X) || X <- SegmentsToCompact],
          GroupIterator = build_group_iterator(SegmentIterators),
  
          %% Create the new compaction segment...
          <<MD5:128/integer>> = erlang:md5(term_to_binary({now, make_ref()})),
  
negative.code:     %% Put together the group iterator...
      BufferIterators = [mi_buffer:iterator(IFT, IFT, X) || X <- Buffers],
      SegmentIterators = [mi_segment:iterator(IFT, IFT, X) || X <- Segments],
      GroupIterator = build_iterator_tree(BufferIterators ++ SegmentIterators),
  
      %% Start streaming...
      stream_inner(F, undefined, undefined, GroupIterator()),
  