docs: def extract_tree(self, labels, without, suppress_unifurcations=True):
          '''Helper function for ``extract_tree_*`` functions'''
          if not isinstance(suppress_unifurcations, bool):
              raise TypeError("suppress_unifurcations must be a bool")
          if labels is not None and not isinstance(labels, set):
              try:
                  labels = set(labels)
              except:
                  raise TypeError("labels must be iterable")
          label_to_leaf = dict(); keep = set()
          for node in self.traverse_leaves():
              label_to_leaf[str(node)] = node
              if labels is None or (without and str(node) not in labels) or (not without and str(node) in labels):
                  keep.add(node)
          for node in list(keep):
              for a in node.traverse_ancestors(include_self=False):
                  keep.add(a)
          out = Tree(); out.root.label = self.root.label; out.root.edge_length = self.root.edge_length
          q_old = deque(); q_old.append(self.root)
          q_new = deque(); q_new.append(out.root)
          while len(q_old) != 0:
              n_old = q_old.popleft(); n_new = q_new.popleft()
              for c_old in n_old.children:
                  if c_old in keep:
                      c_new = Node(label=str(c_old), edge_length=c_old.edge_length); n_new.add_child(c_new)
                      q_old.append(c_old); q_new.append(c_new)
          if suppress_unifurcations:
              out.suppress_unifurcations()
          return out