code: def intersect(self, other):  # type: (Term) -> Union[Term, None]
          
          if self.dependency.name != other.dependency.name:
              raise ValueError(
                  "{} should refer to {}".format(other, self.dependency.name)
              )
  
          if self._compatible_dependency(other.dependency):
              if self.is_positive() != other.is_positive():
                  # foo ^1.0.0 ∩ not foo ^1.5.0 → foo >=1.0.0 <1.5.0
                  positive = self if self.is_positive() else other
                  negative = other if self.is_positive() else self
  
                  return self._non_empty_term(
                      positive.constraint.difference(negative.constraint), True
                  )
              elif self.is_positive():
                  # foo ^1.0.0 ∩ foo >=1.5.0 <3.0.0 → foo ^1.5.0
                  return self._non_empty_term(
                      self.constraint.intersect(other.constraint), True
                  )
              else:
                  # not foo ^1.0.0 ∩ not foo >=1.5.0 <3.0.0 → not foo >=1.0.0 <3.0.0
                  return self._non_empty_term(
                      self.constraint.union(other.constraint), False
                  )
          elif self.is_positive() != other.is_positive():
              return self if self.is_positive() else other
          else:
              return
docs: Returns a Term that represents the packages
          allowed by both this term and another