docs: def _get_all_merges(routing_table):
      """Get possible sets of entries to merge.
  
      Yields
      ------
      :py:class:`~.Merge`
      """
      # Memorise entries that have been considered as part of a merge
      considered_entries = set()
  
      for i, entry in enumerate(routing_table):
          # If we've already considered this entry then skip
          if i in considered_entries:
              continue
  
          # Construct a merge by including other routing table entries below this
          # one which have equivalent routes.
          merge = set([i])
          merge.update(
              j for j, other_entry in enumerate(routing_table[i+1:], start=i+1)
              if entry.route == other_entry.route
          )
  
          # Mark all these entries as considered
          considered_entries.update(merge)
  
          # If the merge contains multiple entries then yield it
          if len(merge) > 1:
              yield _Merge(routing_table, merge)