docs: def mro(*bases):
      """Calculate the Method Resolution Order of bases using the C3 algorithm.
  
      Suppose you intended creating a class K with the given base classes. This
      function returns the MRO which K would have, *excluding* K itself (since
      it doesn't yet exist), as if you had actually created the class.
  
      Another way of looking at this, if you pass a single class K, this will
      return the linearization of K (the MRO of K, *including* itself).
  
      Found at:
      http://code.activestate.com/recipes/577748-calculate-the-mro-of-a-class/
      """
      seqs = [list(C.__mro__) for C in bases] + [list(bases)]
      res = []
      while True:
          non_empty = list(filter(None, seqs))
          if not non_empty:
              # Nothing left to process, we're done.
              return tuple(res)
          for seq in non_empty:  # Find merge candidates among seq heads.
              candidate = seq[0]
              not_head = [s for s in non_empty if candidate in s[1:]]
              if not_head:
                  # Reject the candidate.
                  candidate = None
              else:
                  break
          if not candidate:
              raise TypeError("inconsistent hierarchy, no C3 MRO is possible")
          res.append(candidate)
          for seq in non_empty:
              # Remove candidate.
              if seq[0] == candidate:
                  del seq[0]