Given an interval `start:stop`, return the smallest bin in which it fits.

    :arg int start, stop: Interval positions (zero-based, open-ended).

    :return: Smallest bin containing `start:stop`.
    :rtype: int

    :raise OutOfRangeError: If `start:stop` exceeds the range of the binning
      scheme.

def assign_bin(start, stop):
    """
    Given an interval `start:stop`, return the smallest bin in which it fits.

    :arg int start, stop: Interval positions (zero-based, open-ended).

    :return: Smallest bin containing `start:stop`.
    :rtype: int

    :raise OutOfRangeError: If `start:stop` exceeds the range of the binning
      scheme.
    """
    try:
        return next(dropwhile(lambda r: r[0] != r[1],
                              range_per_level(start, stop)))[0]
    except StopIteration:
        raise Exception('An unexpected error occured in assigning a bin')