docs: def apply(self, aliases):
          """Apply the merge to the routing table it is defined against and get a
          new routing table and alias dictionary.
  
          Returns
          -------
          [:py:class:`~rig.routing_table.RoutingTableEntry`, ...]
              A new routing table which may be minimised further.
          {(key, mask): {(key, mask), ...}}
              A new aliases dictionary.
          """
          # Create a new routing table of the correct size
          new_size = len(self.routing_table) - len(self.entries) + 1
          new_table = [None for _ in range(new_size)]
  
          # Create a copy of the aliases dictionary
          aliases = dict(aliases)
  
          # Get the new entry
          new_entry = RoutingTableEntry(
              route=self.routing_table[next(iter(self.entries))].route,
              key=self.key, mask=self.mask, sources=self.sources
          )
          aliases[(self.key, self.mask)] = our_aliases = set([])
  
          # Iterate through the old table copying entries acrosss
          insert = 0
          for i, entry in enumerate(self.routing_table):
              # If this is the insertion point then insert
              if i == self.insertion_index:
                  new_table[insert] = new_entry
                  insert += 1
  
              if i not in self.entries:
                  # If this entry isn't to be removed then copy it across to the
                  # new table.
                  new_table[insert] = entry
                  insert += 1
              else:
                  # If this entry is to be removed then add it to the aliases
                  # dictionary.
                  km = (entry.key, entry.mask)
                  our_aliases.update(aliases.pop(km, {km}))
  
          # If inserting beyond the end of the old table then insert at the end
          # of the new table.
          if self.insertion_index == len(self.routing_table):
              new_table[insert] = new_entry
  
          return new_table, aliases