def METHOD_NAME(self, new_min: int, new_max: int):
    """Update the range subject to constraints
    There are two modes:
    If you update the range by changing only the top value,
    the generator will finish generating the first list before
    expanding its scope.
    So if you configured it with range(0,10) and then
    range(0,20) you would get
    shuffle(list(range(0,10)) + shuffle(list(range(10,20))
    Not:
    shuffle(list(range(0,10) + list(range(10,20))
    If you update the range by changing both values, the previous
    generator is just discarded, because you presumably don't
    want those values anymore. The new bottom must be higher
    than the old top. This preserves the rule that no value is
    ever produced twice.
    """
    if new_min == self.min:
        self.set_new_max(new_max)
    else:
        assert new_min >= self.orig_max, (new_min, self.orig_max)
        self._set_new_range_immediately(new_min, new_max)