code: def diff(compiled_requirements, installed_dists):
      
      requirements_lut = {r.link or key_from_req(r.req): r for r in compiled_requirements}
  
      satisfied = set()  # holds keys
      to_install = set()  # holds InstallRequirement objects
      to_uninstall = set()  # holds keys
  
      pkgs_to_ignore = get_dists_to_ignore(installed_dists)
      for dist in installed_dists:
          key = key_from_req(dist)
          if key not in requirements_lut or not requirements_lut[key].match_markers():
              to_uninstall.add(key)
          elif requirements_lut[key].specifier.contains(dist.version):
              satisfied.add(key)
  
      for key, requirement in requirements_lut.items():
          if key not in satisfied and requirement.match_markers():
              to_install.add(requirement)
  
      # Make sure to not uninstall any packages that should be ignored
      to_uninstall -= set(pkgs_to_ignore)
  
      return (to_install, to_uninstall)
docs: Calculate which packages should be installed or uninstalled, given a set
      of compiled requirements and a list of currently installed modules.