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