def reverse_lookup_then_remove()

in multiset_codec/msbst.py [0:0]


def reverse_lookup_then_remove(multiset, idx):
    ''' Performs reverse_lookup followed by remove, in one-pass.'''
    size, y, left, right = multiset
    y_start = left[0] if left else 0
    y_freq = size - y_start - (right[0] if right else 0)
    if idx < y_start:
        left, (start, freq), x = reverse_lookup_then_remove(left, idx)
    elif idx >= y_start + y_freq:
        size_not_right = size - right[0]
        right, (start, freq), x = \
                reverse_lookup_then_remove(right, idx - size_not_right)
        start = start + size_not_right
    else:
        x, start, freq = y, y_start, y_freq
    size = size - 1
    return (size, y, left, right) if size else (), (start, freq), x