docs: def yield_sorted_by_type(*typelist):
      """
      a useful decorator for the collect_impl method of SuperChange
      subclasses. Caches the yielded changes, and re-emits them
      collected by their type. The order of the types can be specified
      by listing the types as arguments to this decorator. Unlisted
      types will be yielded last in no guaranteed order.
  
      Grouping happens by exact type match only. Inheritance is not
      taken into consideration for grouping.
      """
  
      def decorate(fun):
          @wraps(fun)
          def decorated(*args, **kwds):
              return iterate_by_type(fun(*args, **kwds), typelist)
          return decorated
  
      return decorate