docs: def merge(self, other):
          """
          Merges the two values
          """
          other = self.coerce(other)
          if list_diff(self.domain, other.domain) != []:
              raise Exception("Incomparable orderings. Different domains")
          if self.is_equal(other):
              # pick among dependencies
              return self
          elif other.is_entailed_by(self):
              return self
          elif self.is_entailed_by(other):
              self.low, self.high = other.low, other.high
          elif self.is_contradictory(other):
              raise Contradiction("Cannot merge %s and %s" % (self, other))
          else:
              # information in both
              to_i = self.to_i
              self.low = self.domain[max(map(to_i, [self.low, other.low]))]
              self.high =self.domain[min(map(to_i, [self.high, other.high]))]
          return self