def irange_key(self, min_key=None, max_key=None, inclusive=(True, True),<EOL>reverse=False):
_maxes = self._maxes<EOL>if not _maxes:<EOL><INDENT>return iter(())<EOL><DEDENT>_keys = self._keys<EOL>if min_key is None:<EOL><INDENT>min_pos = <NUM_LIT:0><EOL>min_idx = <NUM_LIT:0><EOL><DEDENT>else:<EOL><INDENT>if inclusive[<NUM_LIT:0>]:<EOL><INDENT>min_pos = bisect_left(_maxes, min_key)<EOL>if min_pos == len(_maxes):<EOL><INDENT>return iter(())<EOL><DEDENT>min_idx = bisect_left(_keys[min_pos], min_key)<EOL><DEDENT>else:<EOL><INDENT>min_pos = bisect_right(_maxes, min_key)<EOL>if min_pos == len(_maxes):<EOL><INDENT>return iter(())<EOL><DEDENT>min_idx = bisect_right(_keys[min_pos], min_key)<EOL><DEDENT><DEDENT>if max_key is None:<EOL><INDENT>max_pos = len(_maxes) - <NUM_LIT:1><EOL>max_idx = len(_keys[max_pos])<EOL><DEDENT>else:<EOL><INDENT>if inclusive[<NUM_LIT:1>]:<EOL><INDENT>max_pos = bisect_right(_maxes, max_key)<EOL>if max_pos == len(_maxes):<EOL><INDENT>max_pos -= <NUM_LIT:1><EOL>max_idx = len(_keys[max_pos])<EOL><DEDENT>else:<EOL><INDENT>max_idx = bisect_right(_keys[max_pos], max_key)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>max_pos = bisect_left(_maxes, max_key)<EOL>if max_pos == len(_maxes):<EOL><INDENT>max_pos -= <NUM_LIT:1><EOL>max_idx = len(_keys[max_pos])<EOL><DEDENT>else:<EOL><INDENT>max_idx = bisect_left(_keys[max_pos], max_key)<EOL><DEDENT><DEDENT><DEDENT>return self._islice(min_pos, min_idx, max_pos, max_idx, reverse)<EOL>
Create an iterator of values between `min_key` and `max_key`.

`inclusive` is a pair of booleans that indicates whether the min_key
and max_key ought to be included in the range, respectively. The
default is (True, True) such that the range is inclusive of both
`min_key` and `max_key`.

Both `min_key` and `max_key` default to `None` which is automatically
inclusive of the start and end of the list, respectively.

When `reverse` is `True` the values are yielded from the iterator in
reverse order; `reverse` defaults to `False`.