docs: def _uninstall(name=None, pkgs=None, root=None):
      '''
      Remove and purge do identical things but with different Zypper commands,
      this function performs the common logic.
      '''
      try:
          pkg_params = __salt__['pkg_resource.parse_targets'](name, pkgs)[0]
      except MinionError as exc:
          raise CommandExecutionError(exc)
  
      includes = _find_types(pkg_params.keys())
      old = list_pkgs(root=root, includes=includes)
      targets = []
      for target in pkg_params:
          # Check if package version set to be removed is actually installed:
          # old[target] contains a comma-separated list of installed versions
          if target in old and pkg_params[target] in old[target].split(','):
              targets.append(target + "-" + pkg_params[target])
          elif target in old and not pkg_params[target]:
              targets.append(target)
      if not targets:
          return {}
  
      systemd_scope = _systemd_scope()
  
      errors = []
      while targets:
          __zypper__(systemd_scope=systemd_scope, root=root).call('remove', *targets[:500])
          targets = targets[500:]
  
      _clean_cache()
      new = list_pkgs(root=root, includes=includes)
      ret = salt.utils.data.compare_dicts(old, new)
  
      if errors:
          raise CommandExecutionError(
              'Problem encountered removing package(s)',
              info={'errors': errors, 'changes': ret}
          )
  
      return ret