docs: def updated_topology_description(topology_description, server_description):
      """Return an updated copy of a TopologyDescription.
  
      :Parameters:
        - `topology_description`: the current TopologyDescription
        - `server_description`: a new ServerDescription that resulted from
          an ismaster call
  
      Called after attempting (successfully or not) to call ismaster on the
      server at server_description.address. Does not modify topology_description.
      """
      address = server_description.address
  
      # These values will be updated, if necessary, to form the new
      # TopologyDescription.
      topology_type = topology_description.topology_type
      set_name = topology_description.replica_set_name
      max_set_version = topology_description.max_set_version
      max_election_id = topology_description.max_election_id
      server_type = server_description.server_type
  
      # Don't mutate the original dict of server descriptions; copy it.
      sds = topology_description.server_descriptions()
  
      # Replace this server's description with the new one.
      sds[address] = server_description
  
      if topology_type == TOPOLOGY_TYPE.Single:
          # Single type never changes.
          return TopologyDescription(
              TOPOLOGY_TYPE.Single,
              sds,
              set_name,
              max_set_version,
              max_election_id,
              topology_description._topology_settings)
  
      if topology_type == TOPOLOGY_TYPE.Unknown:
          if server_type == SERVER_TYPE.Standalone:
              sds.pop(address)
  
          elif server_type not in (SERVER_TYPE.Unknown, SERVER_TYPE.RSGhost):
              topology_type = _SERVER_TYPE_TO_TOPOLOGY_TYPE[server_type]
  
      if topology_type == TOPOLOGY_TYPE.Sharded:
          if server_type not in (SERVER_TYPE.Mongos, SERVER_TYPE.Unknown):
              sds.pop(address)
  
      elif topology_type == TOPOLOGY_TYPE.ReplicaSetNoPrimary:
          if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos):
              sds.pop(address)
  
          elif server_type == SERVER_TYPE.RSPrimary:
              (topology_type,
               set_name,
               max_set_version,
               max_election_id) = _update_rs_from_primary(sds,
                                                          set_name,
                                                          server_description,
                                                          max_set_version,
                                                          max_election_id)
  
          elif server_type in (
                  SERVER_TYPE.RSSecondary,
                  SERVER_TYPE.RSArbiter,
                  SERVER_TYPE.RSOther):
              topology_type, set_name = _update_rs_no_primary_from_member(
                  sds, set_name, server_description)
  
      elif topology_type == TOPOLOGY_TYPE.ReplicaSetWithPrimary:
          if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos):
              sds.pop(address)
              topology_type = _check_has_primary(sds)
  
          elif server_type == SERVER_TYPE.RSPrimary:
              (topology_type,
               set_name,
               max_set_version,
               max_election_id) = _update_rs_from_primary(sds,
                                                          set_name,
                                                          server_description,
                                                          max_set_version,
                                                          max_election_id)
  
          elif server_type in (
                  SERVER_TYPE.RSSecondary,
                  SERVER_TYPE.RSArbiter,
                  SERVER_TYPE.RSOther):
              topology_type = _update_rs_with_primary_from_member(
                  sds, set_name, server_description)
  
          else:
              # Server type is Unknown or RSGhost: did we just lose the primary?
              topology_type = _check_has_primary(sds)
  
      # Return updated copy.
      return TopologyDescription(topology_type,
                                 sds,
                                 set_name,
                                 max_set_version,
                                 max_election_id,
                                 topology_description._topology_settings)