in lib/src/priority_queue.dart [345:381]
int _locate(E object) {
if (_length == 0) return -1;
// Count positions from one instead of zero. This gives the numbers
// some nice properties. For example, all right children are odd,
// their left sibling is even, and the parent is found by shifting
// right by one.
// Valid range for position is [1.._length], inclusive.
var position = 1;
// Pre-order depth first search, omit child nodes if the current
// node has lower priority than [object], because all nodes lower
// in the heap will also have lower priority.
do {
var index = position - 1;
var element = _elementAt(index);
var comp = comparison(element, object);
if (comp <= 0) {
if (comp == 0 && element == object) return index;
// Element may be in subtree.
// Continue with the left child, if it is there.
var leftChildPosition = position * 2;
if (leftChildPosition <= _length) {
position = leftChildPosition;
continue;
}
}
// Find the next right sibling or right ancestor sibling.
do {
while (position.isOdd) {
// While position is a right child, go to the parent.
position >>= 1;
}
// Then go to the right sibling of the left-child.
position += 1;
} while (position > _length); // Happens if last element is a left child.
} while (position != 1); // At root again. Happens for right-most element.
return -1;
}